使用Visual Studio的Linux支持调试库代码

时间:2017-10-23 13:44:21

标签: c++ gdb visual-studio-2017 remote-debugging visual-studio-debugging

我正在使用Visual Studio 2017的集成在Windows子系统Linux中本地构建和调试CMake Linux应用程序。

运行应用程序时,Visual Studio使用与localhost的ssh连接来运行cmake -DCMAKE_BUILD_TYPE="Debug" ..make,然后使用gdbserver来调试应用程序。这适用于我的应用程序自己的代码,包括断点和逐行调试。

此应用程序链接到库文件libhypro.so.17.09,该文件也是CMake项目的一部分。这个库也是在本地构建的(存储在我的Windows文件系统中,在Linux中通过/mnt/c/ mount构建,就像主应用程序一样)在调试模式下。 CMake确实自动发现了依赖。

我在调试此库的调用时遇到问题。例如,如果我在调用库代码之前中断并选择 Step Into ,那么这就是我最终的结果:

screenshot from Visual Studio

请注意

  • 调用堆栈已消失,显示[Unknown/Just-In-Time compiled code]
  • 我在一个未处理的异常中(我最终会打到它,但肯定不会在 Step Into 之后立即发生)和
  • Modules 窗口表示没有符号可用。

此外,我确实在库的代码中设置了一个断点,Visual Studio(正确)断言“断点当前不会被命中”。此外,Debug输出打印Loaded '/mnt/c/Users/felix/git/hypro/build/libhypro.so.17.09'. Cannot find or open the symbol file.

我相对确定libhypro.so.17.09 包含调试符号,因为nm -gC libhypro.so打印很多输出。

我的案例似乎与this question类似,但我没有手动指定库的路径,而是由CMake发现的。

为什么gdb反过来Visual Studio无法调试库的代码?

1 个答案:

答案 0 :(得分:3)

如果您在gdbserver模式下进行调试(默认情况下),请尝试在项目属性/调试页面中切换到gdb模式。

基本上,gdbserver模式是一个很好的想法,从来没有完全交付。这是一个discussion about it on the VCLinux GitHub site。正如您所看到的,gdb一旦修复了控制台应用程序的问题,它将成为默认的调试模式。