我有一个程序,我打算分发给最终用户,并希望从他们那里收到崩溃报告。如果我使用MSVC,我会生成minidump并将那些发送给我,然后用相应的PDB检查它们以获得有用的堆栈跟踪,至少。
与GCC相同的做法是什么?我可以生成堆栈跟踪,但如果我希望它有用,则需要将调试符号编译到可执行文件中(使用-g)。显然,这对于发布分发来说是不可接受的,因为可执行文件的大小可能相当大。
我google了一下,发现对objcopy的引用能够将调试符号分离到一个单独的文件,但该页暗示我仍然需要在发布可执行文件旁边提供调试符号,这显然是不可接受的。 / p>
答案 0 :(得分:7)
好的想法是你使用-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中调试它。
答案 1 :(得分:6)
我找不到一个确切的答案,但我找到了另一种解决方案,它也可以正常工作:在-g旁边编译优化和其他发布标记,将生成的可执行文件存储在某处,然后使用strip删除调试符号。发送剥离的可执行文件,当您获得堆栈跟踪时,将addr2line与原始的未提取的可执行文件结合使用,您应该返回所有符号。