一、问题描述

已生成pdb,但不能调试。“当前不会命中断点,源代码与原始版本不同”

很可能是pdb和可执行文件exe没在同一个目录下

        这个问题通常是由于代码在运行时与其在编译时的原始版本不同所致。以下是一些可能导致这种问题的原因解决方法

  1. 代码没有保存: 确保你在修改代码后保存了文件。某些集成开发环境(IDE)在保存文件之前不会重新编译代码,这可能导致运行时看到与代码不同的版本。

  2. 编译器优化: 某些编译器可能会对代码进行优化,生成与源代码看起来不同的机器代码。在调试时,确保你关闭了编译器的优化选项。这通常可以在编译器的设置或项目配置中找到。

  3. 符号文件不匹配: 确保你在调试时使用了与编译时相匹配的符号文件。符号文件包含了源代码和机器代码之间的映射,如果符号文件与实际运行的二进制文件不匹配,就会导致类似的问题。

  4. 调试信息不一致: 确保在编译时生成了调试信息,并在调试器中加载了这些信息。如果编译时没有生成调试信息,或者调试器没有加载这些信息,就可能导致不一致的问题。

  5. 源代码被更改后未重新编译: 如果你的代码依赖于其他源文件,确保这些文件也已经重新编译。有时修改一个文件后,其他文件可能需要重新编译以反映更改。

二、如何加载调试信息

加载调试信息通常是在调试器中完成的。调试信息包括了源代码和二进制代码之间的映射,以及变量、函数名称等信息,这样调试器就能够更好地理解和显示你的代码。下面是一些常见的调试信息加载方法,具体步骤可能因调试器和开发环境而异。

Visual Studio (Windows):

  1. 确保生成调试信息: 在项目属性中的 "C/C++" -> "General" 中,确保 "Debug Information Format" 被设置为 "Program Database (/Zi)",并在 "Linker" -> "Debugging" 中设置 "Generate Debug Info" 为 "Yes (/DEBUG)"。

  2. 启用调试模式: 在 "Configuration Manager" 中,确保你的项目被配置为 "Debug"。

  3. 加载符号文件: 在调试时,可以在 Visual Studio 中的 "Debug" 菜单下选择 "Options" -> "Debugging" -> "Symbols"。确保 "Microsoft Symbol Servers" 被启用,并检查 "Cache symbols in this directory" 设置是否正确。点击 "Load all symbols" 按钮以加载符号文件。

GCC/GDB (Linux):

  1. 生成调试信息: 在编译时,使用 -g 选项生成调试信息。例如:g++ -g -o myprogram myprogram.cpp

  2. 启动 GDB: 在命令行中运行 GDB,并指定你的可执行文件。例如:gdb ./myprogram

  3. 加载符号文件: 在 GDB 中,使用 file 命令加载你的可执行文件。例如:file ./myprogram

LLDB (macOS/Linux):

  1. 生成调试信息: 使用 -g 选项生成调试信息。例如:clang++ -g -o myprogram myprogram.cpp

  2. 启动 LLDB: 在命令行中运行 LLDB,并指定你的可执行文件。例如:lldb ./myprogram

  3. 加载符号文件: 在 LLDB 中,使用 target create 命令加载你的可执行文件。例如:target create ./myprogram

注意事项:

  • 在某些情况下,符号文件可能被分开存储,例如 .pdb 文件(Windows)或 .dSYM 文件(macOS)。确保这些文件与可执行文件在同一目录下或被正确引用。

  • 如果你使用了构建系统(如 CMake),确保它正确配置了调试信息生成。

  • 在使用第三方库时,确保库的调试信息也是可用的。有时候,你可能需要手动下载符号文件。

三、.pdb 文件(Windows)或与可执行文件在同一目录下或被正确引用

确保 .pdb 文件与可执行文件在同一目录下是一种常见的做法,因为调试器通常会在同一目录下查找符号文件。如果 .pdb 文件不在同一目录下,你可以采取以下一些方法来确保调试器能够正确加载符号信息:

  1. 将 .pdb 文件放在可执行文件所在的目录: 最简单的方法是将 .pdb 文件放在可执行文件的目录中。这样调试器会首先在相同的目录中查找符号文件。

  2. 手动指定符号文件路径: 在调试器中,你通常可以手动指定符号文件的路径。这个选项通常在调试器的设置或调试选项中。你可以添加 .pdb 文件的完整路径,以确保调试器能够找到它。

  3. 在项目属性中配置 .pdb 文件输出路径: 如果你使用 Visual Studio,你可以在项目属性中的 "Linker" -> "Debugging" 中配置 .pdb 文件的输出路径。确保 .pdb 文件被输出到可执行文件所在的目录。

  4. 使用环境变量: 有些调试器允许你通过环境变量指定符号文件路径。你可以设置一个环境变量,告诉调试器在哪里查找符号文件。

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐