用strace定位bug

背景

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

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

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

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

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

image

问题解决思路:

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

分析过程

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

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [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等路径少了一个/符号

    修改后,就编译成功了

    image

总结

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