如何用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)核心

不需要提供任何命令行参数。 由于较早的练习而生成的代码转储。