2011-11-29 119 views
95

我的程序操作是這樣的:如何用gdb分析程序的核心轉儲文件?

exe -p param1 -i param2 -o param3 

墜毀,併產生一個核心轉儲文件core.pid

我想

gdb ./exe -p param1 -i param2 -o param3 core.pid 

分析核心轉儲文件,但gdb的識別paramters exe作爲gdb的輸入。

如何分析核心轉儲文件在這種情況呢?

+1

你確定你的'exe'不是一個shell腳本(用來設置一些變量等) 'firefox'在Linux上? –

+1

http://unix.stackexchange.com/questions/89933/how-to-view-core-files-for-debugging-purposes-in-linux/202443#202443 –

回答

121

您可以使用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) 

如果你想將參數傳遞給可執行文件在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選項。

20

只跳過參數,可以GDB不需要它們:

gdb ./exe core.pid 
+0

但這不起作用。 gdb輸出警告:核心文件可能與指定的可執行文件不匹配。 無法從內存中讀取有效的目標文件映像。 – Treper

+4

「核心文件可能與指定的可執行文件不匹配」。你生成核心後修改exe文件嗎?你有沒有用不同的命令行選項重建它?爲GDB提供*精確的*相同的二進制文件生成內核是非常重要的。如果你不這樣做,你會得到垃圾。 –

+2

還要確保傳遞給gdb的二進制文件沒有被去除。您可以運行'文件',顯示它是否被剝離。 –

9

RMS's gdb Debugger Tutorial

prompt > myprogram 
Segmentation fault (core dumped) 
prompt > gdb myprogram 
... 
(gdb) core core.pid 
... 

確保您的文件確實是一個core圖像 - 檢查使用file

+2

他的教程很不錯。但是,截至11/30/16,他的網站不在那裏。它可能會回來,但在此期間,您可以在Wayback Machine上查看他的教程:https://web.archive.org/web/20161015015746/http://www.unknownroad.com/rtfm/gdbtut/gdbtoc。 HTML –

1

您可以分析使用「廣發行」命令核心轉儲文件。

gdb - The GNU Debugger 

syntax: 

# gdb executable-file core-file 

ex: # gdb out.txt core.xxx 

謝謝。

16

GDB的簡單的使用,調試核心轉儲文件:一個 「過程」

gdb <executable_path> <coredump_file_path> 

內核轉儲文件被創建,如 「core.pid」 文件。 後得到gdb的提示符,(在上述命令的執行),類型內;

... 
(gdb) where 

這將爲您提供堆棧信息,您可以從中找出崩潰/故障的原因。 其他命令,用於相同的目的是;

... 
(gdb) bt full 

這與上述相同。按照慣例,它列出了整個堆棧信息(最終導致崩潰位置)。

6

稍微不同的方法將允許您完全跳過GDB。如果你想要的只是一個回溯,linux特有的工具'catchsegv'將捕獲SIGSEGV並顯示回溯。

0

只需輸入命令

$ gdb <Binary> <codeDump> 

$ gdb <binary> 

$ gdb) core <coreDump> 

無需提供任何命令行arguement。由於較早的練習而生成的代碼轉儲。

2

無論可執行文件是否有參數,都可以在任何帶有生成的核心文件的二進制文件上運行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) 

從上面的輸出,你可以猜到一些有關核心無論是空或訪問SIGABORT等。

這些號碼#0〜#10是GDB的堆棧幀。這些堆棧幀不是你的二進制文件。在上面的0 - 10幀,如果你懷疑什麼不妥選擇框

(gdb) frame 8 

我們看到關於它的更多詳細信息:

(gdb) list + 

爲了進一步調查的問題,你可以在這裏打了懷疑變量值這個時間點。

(gdb) print thread_name