2011-01-13 43 views
8

我有一个程序,我打算分发给最终用户,并希望收到他们的崩溃报告。如果我使用的是MSVC,我会生成小型转储并将其发送给我,然后用相应的PDB检查它们以获得有用的堆栈跟踪。GCC相当于PDB

与GCC做同样的事情是什么?我可以生成一个堆栈跟踪,但是如果我希望它有用,它需要将调试符号编译到可执行文件中(使用-g)。显然,这对发行版本来说是不可接受的,因为可执行文件的大小可能会相当大。

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

回答

5

我无法找到确切的答案,但我找到了一个可行的替代解决方案:与优化和其他版本标记一起编译,并将结果可执行文件存储在某处,然后使用strip删除调试符号。发送已剥离的可执行文件,并在获取堆栈跟踪时,将addr2line与原始未剥离可执行文件结合使用,并且应该将所有符号都回收。

6

那么这个想法是你编译与-g添加调试符号,但不会减慢程序,即。大多数程序会做-g -O2,那么你可以用objdump来分隔调试符号。之后,您可以发布strip版本,因此它不会有任何调试符号。

更新:最近GDB支持独立的调试文件,请参阅https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html

例如,你可以斗

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

现在你prog不会有任何调试符号。但是你可以使用proc.debug文件在gdb中进行调试。

+0

这很好,但是我怎样才能在没有调试符号(因此只包含地址)的情况下生成的堆栈跟踪与稍后分离的调试符号进行协调,以获取我实际可以读取的堆栈跟踪? – pjohansson 2011-01-13 11:05:35