seb*_*cci 5 debugging assembly gcc
我想知道调试器如何才能逐步遍历源代码。
编译好源代码并运行程序后,调试器如何知道机器级指令与更高级别的语句之间的对应关系?
例如,如果我在源文件的一行上设置了一个断点,它如何知道要在哪条机器级指令处停止?
查看 asm 输出gcc -g -S,您将看到.line与 C 源代码行对应的 asm 块的 debug-info 指令等。
(启用优化后,同一行可以映射到多个不连续的指令,因此它变得更加棘手,但编译器仍然尝试有用并将大多数指令映射到某些源代码行,即使它们实际上是优化的结果并执行源中未出现的操作...)。
https://godbolt.org/使用与调试器相同的调试信息,但使用它进行颜色突出显示以将源代码行与 asm 进行匹配。
当汇编器汇编这些.line指令时,它会在目标文件中创建调试信息.o,最终链接到可执行文件或库中。或者分割成一个单独的调试符号文件。或者被剥夺。
调试器读取的就是这个调试信息。
(调试信息还包括有关哪些命名 C 变量存储在何处以及它们的类型的信息。对于局部变量,这些位置相对于包含它们的函数的堆栈帧。)