在 Visual Studio 的 Linux 支持下调试库代码

Debugging Library Code with Visual Studio's Linux support

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

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

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

我在调试对该库的调用时遇到问题。例如,如果我在调用库代码之前中断并选择 Step Into,这就是我结束的地方:

注意

此外,我确实在库的代码中设置了一个断点,Visual Studio(正确地)断言“当前不会命中断点”。此外,调试输出打印 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 无法调试库的代码?

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

基本上,gdbserver 模式是一个不错的想法,但从未完全实现。这是一个 discussion about it on the VCLinux GitHub site。正如您将看到的,一旦他们解决了控制台应用程序的问题,gdb 将成为默认调试模式。