【问题标题】:How do I trace into an externally-compiled lib in Visual C++如何在 Visual C++ 中跟踪到外部编译的库
【发布时间】:2009-11-06 23:13:44
【问题描述】:

我在我的 Windows 机器上构建了 OpenSSL 的非 dll 版本。根据说明,我修改了构建脚本以包含调试符号。我可以很好地链接它们并且它们运行。但是当我尝试从我的 cpp 代码中进入一个 openssl 函数时,它只是跳过了。我知道这完全是一个菜鸟问题,但我该如何解决这个问题?我有所有的源代码和标头,但我认为一定有我缺少的魔术调用来告诉 Visual Studio 它们在哪里。什么的。

谢谢! Mac-guy-suffering-in-windows-land

【问题讨论】:

  • 感谢大家的帮助。事实证明,我需要编辑 openssl makefile 以使用编译器选项 /Z7。这会导致符号信息被烹制到 obj 文件中,以便在链接器在库中链接时它们仍然可供链接器使用。

标签: c++ debugging visual-c++ linker trace


【解决方案1】:

您可以通过use dumpbin with the /pdbpath 选项来定位二进制符号文件;如果找不到符号,则需要将它们移动到可以找到它们的位置。

PDB 路径通常被硬编码到二进制文件中,因此您无法在构建可执行文件后移动 PDB。您可以use the (undocumented) /pdbpath:none linker option 使用其 PDB 文件的相对路径构建二进制文件;然后您可以将 PDB 放在二进制文件旁边,调试器应该会找到它。

请注意,仅当二进制文件为 linked with the /DEBUG option 时才会生成 PDB 文件。

【讨论】:

    【解决方案2】:

    当您构建 OpenSSL 时,您指定符号文件应该放在哪里?它与您的可执行文件在同一目录中吗?

    【讨论】:

    • 不。那么我应该移动它,还是可以将 VC 指向它,或者我是否需要重建 lib 并让它输出 VC 期望找到它的所有内容?感谢您的快速回答,顺便说一句。认为这对我来说一定是愚蠢的。
    • 符号 (pdb) 文件不需要在同一目录中:它的路径被硬编码到 executabe/dll 中
    • 我拥有的是一个 .lib(实际上是 2 个)。我在十六进制编辑器中查看文件,但看不到 pdb 文件名 - 它应该可见吗?再次感谢您的帮助!
    【解决方案3】:

    符号文件 (pdb's) 仅存在于模块(exe 和 dll's)中,不存在于目标文件中。库只是 .obj 文件的集合。

    如果源代码是使用调试信息编译的,那么它会嵌入到 .obj 文件中,链接器会将其提取到最终的 pdb 中。您所需要的只是让您的 exe 能够查看 OpenSSL 代码的符号的 pdb。

    您需要在调试器中设置源路径以包含 OpenSSL 目录,以便能够将这些符号与源对齐。

    如果您使用的是 Visual Studio,请确保调试器设置中的“仅调试我的代码”选项(或类似的选项)禁用 ...尽管我认为这不会影响代码编译到你的exe中。调试器更可能只是不知道要进入源代码的位置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-29
      • 2015-08-15
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      相关资源
      最近更新 更多