【问题标题】:GDB prints different C++ output between MSVC2012 and GCC 7.3.1GDB 在 MSVC2012 和 GCC 7.3.1 之间打印不同的 C++ 输出
【发布时间】:2015-06-04 21:13:33
【问题描述】:

我在使用我们软件的两个发行版本时遇到问题。我有两个可执行文件(MS 和 Linux),分别使用 MSVC 和 GCC 编译库。

上下文:

我的程序包含一个 message_queue.hpp 模板类,它继承自 message_queue_inter.h 接口。此接口包含来自静态库的包含。 这两个库都经过 O2 优化,没有任何调试信息(调试信息格式 -> MSVC 为无,GCC 为 -g0)。

事实是,当我调试两个可执行文件(在 Eclipse 中)时,GDB 可以在我的派生类和我的 MSVC 可执行文件中的基类(接口)中找到成员的符号(我可以在 Eclipse 中扩展变量内容调试视图)

相反,使用 GNU/Linux 库的版本无法找到仅在界面中的成员的符号。 如果我尝试从我的界面访问成员,GDB 会为它返回“No Data Fields”。派生 (.hpp) 类的所有成员都正确显示。

为什么 MSCV 和 GCC 编译器之间存在如此大的差异? 当然,我注意到 MSVC 库比 GCC 库大得多。 感谢“nm”工具,我可以注意到接口符号在我的 MSVC 库中找到,但在 GNU/Linux 库中没有。

我知道发布版本不应该包含任何调试信息,但我想知道为什么我可以使用 MSVC 而不是 GCC 访问这个变量。 (我需要构建一个g2最低的GCC调试版本来生成更多的符号,以便显示消息队列的内容)。

我迷路了!

感谢您的帮助。

【问题讨论】:

    标签: c++ visual-c++ gdb eclipse-cdt debug-symbols


    【解决方案1】:

    这可能是因为/NODEBUG 的 MS 版本实际上并没有关闭(所有)调试信息,它比 g++ 在-g0 上留下的更多。或者,MS 可能正在编写一个 .pdb 符号文件,gdb 正在查找和读取该文件以获取更详细的符号信息。

    如果您需要调试,我看不出使用 -g2 编译有什么害处。

    【讨论】:

    • 谢谢马克的回答。故意删除 PDB 文件,以免向客户留下任何额外信息。由于性能和可见性的原因,我们希望避免使我们的静态库“调试”。我想在目前的情况下,我们将不得不使用 g2 标志编译我们的 GNU/Linux 库?
    • 还有一些细节:我刚刚在我的 Windows 库上做了一个 dumpbin.exe /ALL,我可以看到与我想访问的属性相关的符号。但是当我在我的 Linux 库上执行“nm”时,我看不到我的属性的任何符号。
    【解决方案2】:

    在发布可执行文件之前,您可以使用“strip”删除符号/调试信息。然后你有两个版本的可执行文件,在你运行 strip 之前和之后。您甚至可以调试已剥离的可执行文件,然后使用 gdb 的 `file' 命令将 gdb 指向未剥离的版本。

    请注意,-gN 或剥离/未剥离不会以任何方式影响可执行文件 - 受影响的只是调试信息部分。

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多