我的程序操作是這樣的:如何用gdb分析程序的核心轉儲文件?
exe -p param1 -i param2 -o param3
墜毀,併產生一個核心轉儲文件core.pid
我想
gdb ./exe -p param1 -i param2 -o param3 core.pid
分析核心轉儲文件,但gdb的識別paramters exe
作爲gdb的輸入。
如何分析核心轉儲文件在這種情況呢?
我的程序操作是這樣的:如何用gdb分析程序的核心轉儲文件?
exe -p param1 -i param2 -o param3
墜毀,併產生一個核心轉儲文件core.pid
我想
gdb ./exe -p param1 -i param2 -o param3 core.pid
分析核心轉儲文件,但gdb的識別paramters exe
作爲gdb的輸入。
如何分析核心轉儲文件在這種情況呢?
您可以使用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選項。
只跳過參數,可以GDB不需要它們:
gdb ./exe core.pid
但這不起作用。 gdb輸出警告:核心文件可能與指定的可執行文件不匹配。 無法從內存中讀取有效的目標文件映像。 – Treper
「核心文件可能與指定的可執行文件不匹配」。你生成核心後修改exe文件嗎?你有沒有用不同的命令行選項重建它?爲GDB提供*精確的*相同的二進制文件生成內核是非常重要的。如果你不這樣做,你會得到垃圾。 –
還要確保傳遞給gdb的二進制文件沒有被去除。您可以運行'文件
prompt > myprogram
Segmentation fault (core dumped)
prompt > gdb myprogram
...
(gdb) core core.pid
...
確保您的文件確實是一個core
圖像 - 檢查使用file
。
他的教程很不錯。但是,截至11/30/16,他的網站不在那裏。它可能會回來,但在此期間,您可以在Wayback Machine上查看他的教程:https://web.archive.org/web/20161015015746/http://www.unknownroad.com/rtfm/gdbtut/gdbtoc。 HTML –
您可以分析使用「廣發行」命令核心轉儲文件。
gdb - The GNU Debugger
syntax:
# gdb executable-file core-file
ex: # gdb out.txt core.xxx
謝謝。
GDB的簡單的使用,調試核心轉儲文件:一個 「過程」
gdb <executable_path> <coredump_file_path>
內核轉儲文件被創建,如 「core.pid」 文件。 後得到gdb的提示符,(在上述命令的執行),類型內;
...
(gdb) where
這將爲您提供堆棧信息,您可以從中找出崩潰/故障的原因。 其他命令,用於相同的目的是;
...
(gdb) bt full
這與上述相同。按照慣例,它列出了整個堆棧信息(最終導致崩潰位置)。
稍微不同的方法將允許您完全跳過GDB。如果你想要的只是一個回溯,linux特有的工具'catchsegv'將捕獲SIGSEGV並顯示回溯。
只需輸入命令
$ gdb <Binary> <codeDump>
或
$ gdb <binary>
$ gdb) core <coreDump>
無需提供任何命令行arguement。由於較早的練習而生成的代碼轉儲。
無論可執行文件是否有參數,都可以在任何帶有生成的核心文件的二進制文件上運行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
你確定你的'exe'不是一個shell腳本(用來設置一些變量等) 'firefox'在Linux上? –
http://unix.stackexchange.com/questions/89933/how-to-view-core-files-for-debugging-purposes-in-linux/202443#202443 –