Gcc 使用调试符号重新编译exe,用于不使用调试符号的exe生成的核心转储
我有一个缺少调试信息的内核转储。转储是由一个不太容易复制的错误引起的Gcc 使用调试符号重新编译exe,用于不使用调试符号的exe生成的核心转储,gcc,gdb,Gcc,Gdb,我有一个缺少调试信息的内核转储。转储是由一个不太容易复制的错误引起的 由于我确切地知道源代码的哪个版本以及原始构建命令和优化级别,是否可以为该可执行文件生成调试信息?是,这是可能的。这是一个相当冗长的例子 产生崩溃的程序(crash.c): 使用调试符号编译版本: $ gcc crash.c -o crash $ gcc -g crash.c -o crash_debug 使用不带调试符号的二进制文件生成核心文件: $ ./crash AAAAAAAAAAAAAAAAAAAAAAAAAAAA
由于我确切地知道源代码的哪个版本以及原始构建命令和优化级别,是否可以为该可执行文件生成调试信息?是,这是可能的。这是一个相当冗长的例子 产生崩溃的程序(
crash.c
):
使用调试符号编译版本:
$ gcc crash.c -o crash
$ gcc -g crash.c -o crash_debug
使用不带调试符号的二进制文件生成核心文件:
$ ./crash AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Segmentation fault (core dumped)
使用gdb
和不带调试符号的二进制查看内核:
$ gdb -q ./crash core
warning: ~/.gdbinit.local: No such file or directory
Reading symbols from ./crash...(no debugging symbols found)...done.
warning: exec file is newer than core file.
[New LWP 7768]
Core was generated by `./crash AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000000000040052b in func ()
正如我们所看到的,gdb
找不到任何调试符号。
现在,让我们尝试使用构建为包含调试符号的二进制文件和core
文件启动gdb
:
$ gdb -q ./crash_debug core
warning: ~/.gdbinit.local: No such file or directory
Reading symbols from ./crash_debug...done.
warning: core file may not match specified executable file.
[New LWP 7768]
Core was generated by `./crash AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000000000040052b in func (str=0x7fff4bb66f73 'A' <repeats 52 times>) at crash.c:8
8 }
希望这有帮助 猜测:只要使用相同的编译器、相同的开关+-g、相同的库构建,它就可能工作。然后用符号文件从这个新的二进制文件加载符号(在已加载可执行文件之后)。谢谢,但不幸的是,它不起作用。我怀疑我的环境与以前略有不同。核心转储为我提供了更多的帧,其中??而不是符号名称。嘿,那太糟糕了:(您尝试了哪个版本?您是使用新二进制文件和编码器启动了
gdb
,例如gdb/path/to/new/bin/path/to/core
,还是使用core运行了gdb
,然后使用symbol file/path/to/new/binary
从新二进制文件中加载符号?此外,您是否确保新二进制文件确实是构建的ld与调试信息?我尝试了两者,当我使用没有符号文件的重新编译二进制文件时,我得到了?
。对不起,我没有时间深入研究这个问题。
$ gdb -q ./crash_debug core
warning: ~/.gdbinit.local: No such file or directory
Reading symbols from ./crash_debug...done.
warning: core file may not match specified executable file.
[New LWP 7768]
Core was generated by `./crash AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000000000040052b in func (str=0x7fff4bb66f73 'A' <repeats 52 times>) at crash.c:8
8 }
$ gdb -q -c core
warning: ~/.gdbinit.local: No such file or directory
[New LWP 7768]
Core was generated by `./crash AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0x000000000040052b in ?? ()
gdb$ symbol-file crash_debug
Reading symbols from crash_debug...done.
gdb$ bt
#0 0x000000000040052b in func (str=0x7fff4bb66f73 'A' <repeats 52 times>) at crash.c:8
#1 0x4141414141414141 in ?? ()
#2 0x00007f0041414141 in ?? ()
#3 0x0000000200000000 in ?? ()
#4 0x0000000000000000 in ?? ()
gdb$