C++ 调试器如何知道如何在源和可执行文件之间映射行?

How C++ debugger knows how to map lines between source and executable?

提问人:jokey 提问时间:10/3/2023 最后编辑:jokey 更新时间:10/4/2023 访问量:84

问:

如果在 VisualStudio 中的一行旁边放置一个断点,使用自定义工具生成项目,然后运行配置的 VS 调试器,调试器如何知道可执行文件中的哪一行属于源代码中的断点行?因为编译器可能会在制作可执行文件之前优化代码。

C++ Linux Visual-Studio 调试

评论

3赞 chrysante 10/3/2023
编译器生成将 CPU 指令映射到代码行的调试信息,反之亦然。但是,这与优化并不相符。启用这些功能后,调试和跳过代码行通常表现得很奇怪,因为生成的程序不再与源代码一一对应。
1赞 Eljay 10/3/2023
例如,有 DWARF 调试信息。
0赞 Pepijn Kramer 10/3/2023
有很多额外的数据/元信息。对于 Visual Studio,所有这些信息都在 pdb 文件中。

答:

4赞 Captain Giraffe 10/3/2023 #1

因为编译器可能会在制作可执行文件之前优化代码。

不,这是 Debug 版本和 Release 版本之间的很大区别。

调试版本将包含许多有关程序的额外信息,而不是执行程序所需的信息。具体而言,所有名称、类、函数和变量都在调试版本中。调试版本将构建的程序映射到您编写的代码中,几乎是 1 对 1 的对应关系。

您会发现调试优化程序与调试调试版本有很大不同。

当你发现一个只在优化的发布版本中表现出来的错误时,你就会遇到一些难题,需要再喝一壶咖啡。