如何在 VS2015 中调试 Clang 静态链接库

Posted

技术标签:

【中文标题】如何在 VS2015 中调试 Clang 静态链接库【英文标题】:How to debug Clang static-linked libraries in VS2015 【发布时间】:2016-07-18 03:30:33 【问题描述】:

我正在用 VS2015 调查 Clang 代码库,.sln 文件是由 CMake 生成的。 我已将解决方案配置为Debug/x64,我可以看到生成的.pdb 文件伴随着库,但我无法中断链接到clang 可执行文件的库代码。

例如,我在 clangParse 模块中设置了一些断点,在解析过程中控制流必须经过这些断点,但是在打印 AST 后,调试器并没有在 clangParse 模块中的断点处停止,而是仅在在 clang 模块本身中设置断点。

对于其他一些手动创建的带有可执行和静态库的解决方案,我可以调试这些库。不知道为什么这不适用于 CMake 生成的 Clang/LLVM 解决方案。

我需要在这里进行任何特殊设置吗?

【问题讨论】:

您能否分享重现此问题的详细步骤?如果只使用“start without debugging(Ctrl+F5)”运行这个项目是否编译成功?如果没有命中断点并且项目编译正常,您是否在输出窗口中收到任何有用的消息?在调试模式下,将鼠标放在没有命中的断点上,或者点击Debug菜单->Windows->Modules窗口,有没有提示信息? @Eddie-MSFT 是的,我可以成功编译并运行它,我可以在 clang 项目中的断点处中断,但不能在其他静态链接库(例如 clangParse)中中断。而且我很确定控制流应该通过我设置的断点。 您能否启用例外设置窗口作为此链接:msdn.microsoft.com/en-us/library/x85tt0dd.aspx。在调用库的代码行(A)中添加一个断点,然后在命中后使用“Step Into(F11)”调试它(A),这样你就可以一步一步调试应用程序,收集消息。请检查 TOOLS->Options->Debugging 下的“Show Disassembly if source is not available”选项。如果仍然没有消息,您可以分享一个简单的示例吗? @Eddie-MSFT 好像那个clang驱动程序自己调用了CreateProcessW,我在那儿迷路了。 【参考方案1】:

问题在于 Clang 驱动程序在 Windows 上内部生成了一个自身的子进程,所有有趣的事情都在子进程中完成,因此库中的断点永远不会命中,因为它们在另一个进程中。

要解决这个问题,请安装Microsoft Child Process Debugging Power Tool 并启用子进程调试,这会将子进程附加到调试器。

【讨论】:

以上是关于如何在 VS2015 中调试 Clang 静态链接库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用“clang-win”工具集构建调试提升静态库?

VS2015 MFC - 如何将静态库资源链接到项目

VS2008如何设置才能使库函数静态链接

如何将静态库添加到 VS 2015 Fortran 项目?

VS2015搭建live555源码调试环境

如何调试 dsymutil 错误:“Clang 模块预计只有 1 个编译单元。”