调试器如何跟踪C代码和汇编指令之间的映射?

seb*_*cci 5 debugging assembly gcc

我想知道调试器如何才能逐步遍历源代码。

编译好源代码并运行程序后,调试器如何知道机器级指令与更高级别的语句之间的对应关系?

例如,如果我在源文件的一行上设置了一个断点,它如何知道要在哪条机器级指令处停止?

Pet*_*des 4

查看 asm 输出gcc -g -S,您将看到.line与 C 源代码行对应的 asm 块的 debug-info 指令等。

(启用优化后,同一行可以映射到多个不连续的指令,因此它变得更加棘手,但编译器仍然尝试有用并将大多数指令映射到某些源代码行,即使它们实际上是优化的结果并执行源中未出现的操作...)。

https://godbolt.org/使用与调试器相同的调试信息,但使用它进行颜色突出显示以将源代码行与 asm 进行匹配。


当汇编器汇编这些.line指令时,它会在目标文件中创建调试信息.o,最终链接到可执行文件或库中。或者分割成一个单独的调试符号文件。或者被剥夺。

调试器读取的就是这个调试信息。

(调试信息还包括有关哪些命名 C 变量存储在何处以及它们的类型的信息。对于局部变量,这些位置相对于包含它们的函数的堆栈帧。)