如何用gdb分析程序的核心转储文件?
我的程序像这样操作:
exe -p param1 -i param2 -o param3
它崩溃并生成一个核心转储文件core.pid
我想通过分析核心转储文件
gdb ./exe -p param1 -i param2 -o param3 core.pid
但gdb认识到exe
的参数作为gdb的input。
如何在这种情况下分析核心转储文件?
你可以通过多种方式使用gdb的核心,但是传递给gdb的参数并不是使用核心文件的方式。 这也可能是你得到这个错误的原因。 您可以通过以下方式使用核心文件:
gdb <executable> <core-file>
或gdb <executable> -c <core-file>
或
gdb <executable> ... (gdb) core <core-file>
当使用核心文件时,你不必传递参数。 崩溃情况在gdb中显示(在Ubuntu上使用gdb Version 7.1进行检查)。 例如:
$ ./crash -p param1 -o param2 Segmentation fault (core dumped) $ gdb ./crash core GNU gdb (GDB) 7.1-ubuntu ... Core was generated by `./crash -p param1 -o param2'. <<<<< See this line shows crash scenario Program terminated with signal 11, Segmentation fault. #0 __strlen_ia32 () at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99 99 ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory. in ../sysdeps/i386/i686/multiarch/../../i586/strlen.S (gdb)
如果要将parameter passing给可执行文件,请在gdb中使用--args
。
例如:
$ gdb --args ./crash -p param1 -o param2 GNU gdb (GDB) 7.1-ubuntu ... (gdb) r Starting program: /home/@@@@/crash -p param1 -o param2 Program received signal SIGSEGV, Segmentation fault. __strlen_ia32 () at ../sysdeps/i386/i686/multiarch/../../i586/strlen.S:99 99 ../sysdeps/i386/i686/multiarch/../../i586/strlen.S: No such file or directory. in ../sysdeps/i386/i686/multiarch/../../i586/strlen.S (gdb)
手册页将有助于查看其他gdb选项。
只需跳过params,gdb不需要它们:
gdb ./exe core.pid
简单的使用GDB来debuggingcoredump文件:
gdb <executable_path> <coredump_file_path>
“进程”的Coredump文件被创build为“core.pid”文件。 进入gdb提示符后(执行上面的命令),键入;
... (gdb) where
这将使您得到堆栈的信息,从而可以确定崩溃/故障的原因。 其他命令,为同样的目的是;
... (gdb) bt full
这和上面一样。 按照惯例,它列出了整个堆栈信息(最终导致崩溃位置)。
从RMS的gdbdebugging器教程 :
prompt > myprogram Segmentation fault (core dumped) prompt > gdb myprogram ... (gdb) core core.pid ...
确保你的文件真的是一个core
图像 – 检查使用file
。
稍微不同的方法将允许您完全跳过GDB。 如果所有你想要的是一个回溯,特定于linux的工具'catchsegv'将捕获SIGSEGV并显示回溯。
您可以使用“gdb”命令分析核心转储文件。
gdb - The GNU Debugger syntax: # gdb executable-file core-file ex: # gdb out.txt core.xxx
谢谢。
无论可执行文件是否有参数,都可以在任何带有生成的核心文件的二进制文件上运行GDB语法如下。
Syntax: gdb <binary name> <generated core file> Eg: gdb l3_entity 6290-corefile
让我拿下面的例子来更多的理解。
bash-4.1$**gdb l3_entity 6290-corefile** **Core was generated** by `/dir1/dir2/dir3/l3_entity **Program terminated with signal SIGABRT, Aborted.** #0 #1 #2 #3 #4 #5 #6 #7 #8 #9 #10 (gdb)
从上面的输出中,你可以猜到核心是NULL访问还是SIGABORT等等。
这些数字#0到#10是GDB的堆栈帧。 这些堆栈帧不是你的二进制文件。 在上面的0 – 10帧,如果你怀疑有任何错误select该帧
(gdb) frame 8
现在来看看更多细节:
(gdb) list +
要进一步调查问题,您可以在此处打印可疑的variables值。
(gdb) print thread_name
只需键入命令$ gdb
或$ gdb
$ gdb)核心
不需要提供任何命令行参数。 由于较早的练习而生成的代码转储。