在 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,这就是我结束的地方:
注意
- 调用堆栈消失,显示
[Unknown/Just-In-Time compiled code]
,
- 我处于一个未处理的异常中(我希望最终会发生这种情况,但肯定不会在 Step Into 之后立即发生)并且
- Modules window表示没有符号可用。
此外,我确实在库的代码中设置了一个断点,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
将成为默认调试模式。
我正在使用 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,这就是我结束的地方:
注意
- 调用堆栈消失,显示
[Unknown/Just-In-Time compiled code]
, - 我处于一个未处理的异常中(我希望最终会发生这种情况,但肯定不会在 Step Into 之后立即发生)并且
- Modules window表示没有符号可用。
此外,我确实在库的代码中设置了一个断点,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
将成为默认调试模式。