用strace定位bug

渗透技巧 2年前 (2021) admin
494 0 0

背景

今年年初(2021年我的学习计划)我就计划补一下”操作系统”这门计算机专业课.

最近我就在学一门网课,是极客时间的操作系统实战 45 讲[1],感觉还可以:代码量是1w行多点,课程我就把它当做一个45讲的代码说明文档。

网上也有一些类似的”实验教学”,比如:

  • kernel实验[2]
  • linux0.11内核解读[3]
  • reactos-操作系统[4]

目前我学习操作系统实战[5]有两个学习目标:

  • 完全理解第十三课的代码[6]:十三课之前的内容包括了整个机器初始化过程
  • 完全理解第二十六课的代码[7]:比”十三课”内容多了”进程”和”内存”

本文记录我在学习时遇到的第一个小问题:编译”第十三课的代码”时遇到一个报错

用strace定位bug
输入图片说明

问题解决思路:

  • 搞清楚”编译器”去哪里找”kernel.inc”文件

分析过程

  • 最简便的方法找到”kernel.inc”文件位置

    strace -f可以跟踪子进程的系统调用

    [root@instance-fj5pftdp Cosmos]# strace -f make 2>/tmp/q.txt
    [root@instance-fj5pftdp Cosmos]# cat /tmp/q.txt
    ...
    [pid 20451] open("kernel.inc", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
    [pid 20451] open("../includekernel.inc", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
    [pid 20451] open("../include/bastypeinckernel.inc", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
    [pid 20451] open("../include/halinckernel.inc", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
    [pid 20451] open("../include/knlinckernel.inc", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
    [pid 20451] open("../include/libinckernel.inc", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
    [pid 20451] open("../include/drvinckernel.inc", O_RDONLY) = -1 ENOENT (没有那个文件或目录)
    [pid 20451] write(2, "../hal/x86/kernel.asm:6: ", 25../hal/x86/kernel.asm:6: ) = 25

    可以发现 ../includekernel.inc等路径少了一个/符号

    修改后,就编译成功了

    用strace定位bug
    输入图片说明

总结

strace -f 真香:不需要我去研究”代码”或者”编译器”是怎么包含”kernel.inc文件”。

参考资料

[1]

操作系统实战 45 讲: https://time.geekbang.org/column/intro/100078401?tab=catalog

[2]

kernel实验: https://github.com/chyyuu/os_kernel_lab

[3]

linux0.11内核解读: https://github.com/sunym1993/flash-linux0.11-talk

[4]

reactos-操作系统: https://reactos.org/

[5]

操作系统实战: https://gitee.com/lmos/cosmos

[6]

第十三课的代码: https://gitee.com/lmos/cosmos/tree/master/lesson13/Cosmos

[7]

第二十六课的代码: https://gitee.com/lmos/cosmos/tree/master/lesson25~26/Cosmos


原文始发于微信公众号(leveryd):用strace定位bug

版权声明:admin 发表于 2021年11月22日 下午1:05。
转载请注明:用strace定位bug | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...