Hello Stack Overflow社区!
所以我目前正在学习操作系统课程,我正在尝试使用GDB调试器设置断点来跟踪OS 161的某些代码的执行情况。我已经玩过它了几个小时,但我很难理解为什么调试器只显示函数名称而不是函数所在的文件路径。例如,显示菜单的代码位于 /os161/os161-1.11/kern/main/main.c 中,当有一个名为&的选项时,会调用一个函数(threadtest3) #34; TT3"由用户选择,它位于名为tt3.c的文件中。它的路径是:〜/ os161 / os161-1.11 / kern / test / tt3.c
我遇到的问题不是设置断点,我试图找出的问题是为什么gdb只在调用它时显示函数名,而不是完整路径。例如,当我在函数threadtest3的开头设置断点时,一旦我选择" tt3"菜单中的选项,调试器显示:
看看调试器如何显示回溯,但只有被称为anod的函数名称没有关于文件的位置或一个函数中的哪一行称为另一个函数?我不确定为什么它会比较调试器如何打印出执行文件start.S的行号,在这张图片中是第163行。
我正在使用GDB版本6.6(Windows 10以及相关信息),起初我认为它是我的调试器的版本,但Youtube上有一个用户具有相同的版本且他的输出没有&# 39;表现得像我的一样。 (https://www.youtube.com/watch?v=U4PYFgzevQ0)
有什么想法吗?
感谢您提供的任何见解。
*****更新3/11/208 / *******
所以我尝试编辑defs.mk文件,根据注释保存所有用于编译的keywaords和常量。此文件位于此下面的目录中。当我第一次查看此文件defs.mk时,标志CC刚刚设置为cs161-gcc。所以经过一些研究并在本网站上查看类似的调试问题后,我尝试通过编写CC = cs161-gcc-g3 -ggdb来更新这一行。我也为HOST_CC和HOST_LDCC做了类似的事情,你可以在下面的图片中看到。然后在转到目录/os161/os161-1.11/kern/compile/ASST1之后,我运行make clean来删除运行make时创建的所有目标文件。然后我通过转到/os161/os161-1.11/kern/conf并运行./config ASST1来重新配置内核。当我回到/os161/os161-1.11/kern/compile/ASST1并在运行make depend之后运行make时,我可以看到它显示正在进行的更改,看起来它正在编译打开调试模式的文件,但我仍然有同样的问题。您可以在
下方看到正在运行的输出答案 0 :(得分:0)
有什么想法吗?
您的代码未编译用于调试。您需要使用-g
标志重建它。
start.S
(您从libc
)链接的是使用-g
编译的,因此它显示了文件和行号。
那么我会将-g标志放在./config ASST1附近吗?或者在其他地方?
您需要阅读./config
并弄明白。
如果您的config
看起来像this,则您需要修改ASST1
并确保其中有debug
指令,例如{{3} }}
<强>更新强>
您的命令行显示实际上正在使用-g
。
您的问题很可能是您正在调试错误的二进制文件。
通常构建一个完整的调试可执行文件,然后在它的副本上运行strip
。剥离的副本是您下载到目标(或仿真器)的副本,并且要小得多(因为所有调试信息都已从中删除)。 未提取的副本是您要为调试器提供的副本。如果你给调试器一个剥离的副本,它仍然可以工作,但不是你希望它工作的方式。