【问题标题】:Debugging Library Code with Visual Studio's Linux support使用 Visual Studio 的 Linux 支持调试库代码
【发布时间】:2018-04-04 02:15:00
【问题描述】:

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

运行应用程序时,Visual Studio 使用 ssh 连接到 localhost 来运行 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 窗口显示没有可用的符号。

此外,我确实在库的代码中设置了一个断点,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 模式。
  • 我愿意,切换到gdb 确实有帮助!现在,符号显示为已加载,当单步执行时,Visual Studio 要求我定位源文件。你知道为什么切换到gdb 会有帮助吗?
  • 另外,您介意将其发布为答案以便我接受吗?

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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-09-24
    • 1970-01-01
    • 2015-08-04
    • 2011-02-16
    • 2011-10-11
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多