GDB在MSVC2012和GCC之间打印不同的C++输出7.3.1

GDB在MSVC2012和GCC之间打印不同的C++输出7.3.1

问题描述:

我遇到了两个版本的软件问题。我有两个可执行文件(MS和Linux)分别使用MSVC和GCC编译库。GDB在MSVC2012和GCC之间打印不同的C++输出7.3.1

语境:

我的程序包含一个message_queue.hpp模板类,它从message_queue_inter.h接口继承。该接口包含来自静态库的包含。 这两个库都经过了O2优化,没有任何调试信息(调试信息格式 - >无MSVC和-g0 GCC)。事实是,虽然我正在调试两个可执行文件(在Eclipse中),但GDB可以在我的派生类中找到成员的符号,并在我的MSVC可执行文件中找到基类(接口)(我可以在Eclipse中展开变量内容在调试视图中)

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

为什么MSCV和GCC编译器有这样的区别? 我注意到,当然,MSVC库比GCC更大。 感谢“nm”工具,我可以注意到接口符号可以在我的MSVC lib中找到,但是在GNU/Linux中找不到。

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

我迷路了!

感谢您的帮助。

大概这是因为MS版本的/NODEBUG实际上并没有关闭(全部)调试信息,并且它比0123.上的g ++更为落后。或者,MS可能正在编写一个.pdb符号文件,该文件gdb正在查找并阅读以获取更详细的符号信息。

如果您需要调试,我看不到在使用-g2进行编译时有任何伤害。

+0

谢谢马克的答案。 PDB文件被有意删除,所以客户不需要额外的信息。由于性能和可视性的原因,我们希望避免使我们的静态库“调试”。 我想在这种情况下,我们将*编译我们的GNU/Linux库g2标志? – David 2015-03-31 15:33:24

+0

更多细节: 我刚刚在我的Windows库上做了一个dumpbin.exe/ALL,我可以看到相对于我想要访问的属性的符号。 但是,当我在我的Linux库上执行“nm”时,我看不到任何符号属性。 – David 2015-04-02 14:42:37

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

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