Debugging PDB的GCC等价物

Debugging PDB的GCC等价物,debugging,visual-c++,gcc,Debugging,Visual C++,Gcc,我有一个计划,我打算分发给最终用户,并希望收到来自他们的崩溃报告。如果我使用的是MSVC,我会生成迷你转储并将它们发送给我,然后用相应的PDB检查它们,至少可以得到有用的堆栈跟踪 在GCC中这样做的等效性是什么?我可以生成堆栈跟踪,但是如果我想让它有用,它需要在可执行文件中编译调试符号(使用-g)。显然,这对于发行版来说是不可接受的,因为可执行文件的大小可能会大幅膨胀 我在谷歌上搜索了一下,发现对objcopy的引用能够将调试符号分离到一个单独的文件中,但该页面暗示我仍然需要在发布可执行文件旁边

我有一个计划,我打算分发给最终用户,并希望收到来自他们的崩溃报告。如果我使用的是MSVC,我会生成迷你转储并将它们发送给我,然后用相应的PDB检查它们,至少可以得到有用的堆栈跟踪

在GCC中这样做的等效性是什么?我可以生成堆栈跟踪,但是如果我想让它有用,它需要在可执行文件中编译调试符号(使用-g)。显然,这对于发行版来说是不可接受的,因为可执行文件的大小可能会大幅膨胀


我在谷歌上搜索了一下,发现对objcopy的引用能够将调试符号分离到一个单独的文件中,但该页面暗示我仍然需要在发布可执行文件旁边提供调试符号,这显然也是不可接受的。

好的想法是使用
-g
编译以添加调试符号,但不会降低程序的速度,也就是说,大多数程序都会执行
-g-O2
,然后可以使用
objdump
分离调试符号。之后,您可以
剥离发布版本,这样它就不会有任何调试符号

更新:最近的gdb支持单独的调试文件,请参阅

例如,你可以

objcopy --only-keep-debug prog prog.debug
strip prog

现在,您的
prog
将没有任何调试符号。但是您可以使用
proc.debug
文件在gdb中调试它。

我找不到这个问题的确切答案,但我找到了一个同样有效的替代解决方案:在
-g
旁边使用优化和其他发布标志进行编译,将生成的可执行文件存储在某个地方,然后使用
strip
删除调试符号。发送剥离的可执行文件,当您获得堆栈跟踪时,将
addr2line
与原始的未剥离的可执行文件结合使用,您应该收回所有符号。

这很好,但是如何协调在没有调试符号(因此只包含地址)的情况下生成的堆栈跟踪稍后使用分离的调试符号,以获得我可以实际读取的堆栈跟踪?gdb可以设置为使用分离的调试符号这就是Linux发行版启用调试的方式,请参阅本页,似乎同样假设调试信息存在于出现故障的计算机上。我要澄清:我们不能将调试信息发送给我们的客户。软件必须能够生成堆栈跟踪(无调试符号),并且该堆栈跟踪在稍后阶段与我们的一台开发计算机上的单独调试符号协调,而无需客户机进一步参与。我也许还应该澄清一下,这是一个Windows环境,而不是*nix环境。如果您生成一个coredump,您可以在gdb上用调试符号重新运行它,这不是您想要的吗?MinGW不包括dbghelp,因此我不可能生成迷你转储。即使我可以,gcc能处理小型转储吗?(与核心转储相反,重申一下,它们是Windows系统。)