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

标签 debugging gcc assembly

我想知道调试器如何能够逐行浏览源代码。

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

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

最佳答案

查看 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/

相关文章:

performance - x86 Assembly pushad/popad,它有多快?

assembly - 为什么 ESP 被 0xFFFFFFF0 屏蔽?

Java 字节码操作 - 许可问题?

JavaScript 函数未在 Firefox 中定义?

php - 引用 - 这个错误在 PHP 中意味着什么?

gcc - 如何以编程方式找到 OpenMP 共享库的路径?

android - fatal error : linux/compiler-gcc6. h:没有这样的文件或目录#include gcc_header(__GNUC__) ^

c - gcc 错误 –Wl,-rpath,./ffmpeg/lib : No such file or directory

visual-studio - 如何使Visual Studio仅在未处理的异常时中断?

android - 升级到最新的 SDK 版本 1.20.4 后运行/调试 Flutter 应用程序非常慢