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