GCC相当于PDB

pjo*_*son 10 debugging gcc visual-c++

我有一个程序,我打算分发给最终用户,并希望收到他们的崩溃报告.如果我使用MSVC,我会生成minidump并将那些发送给我,然后用相应的PDB检查它们以获得有用的堆栈跟踪,至少.

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

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

ism*_*ail 8

好吧,我们的想法是你编译时-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
Run Code Online (Sandbox Code Playgroud)

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

  • 该页面似乎也假设调试信息出现在显示故障的计算机上.我将澄清:我们无法将调试信息发送给我们的客户.软件必须能够生成堆栈跟踪(没有调试符号),并且此堆栈跟踪可以在稍后阶段与我们的一台开发计算机上的单独调试符号进行协调,而无需客户端的进一步参与.我或许也应该澄清这是一个Windows环境,而不是一个*nix环境. (2认同)
  • 如果您生成 coredump,您可以使用调试符号在 gdb 上重新运行它,这不是您想要的吗? (2认同)

pjo*_*son 7

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