使用gdb和core dump迅速定位段錯誤
關鍵字:gdb、段錯誤、core dump
一、什麼是core dump
core:記憶體、核心的意思;
dump:丟擲,扔出;
core dump:前提:當某程式崩潰的一瞬間,核心會丟擲當時該程式程序的記憶體詳細情況,儲存在乙個名叫core.***(***為乙個數字,比如core.699)的檔案中。
二、更改生成的core檔案的大小限制
可見,core檔案是核心生成的,那某乙個程序因為段錯誤而崩潰的時候的記憶體映像很大,那必然會生成乙個很大的core檔案,所以我們可以通過ulimit命令來設定生成core檔案的大小,例如$ulimit -c unlimited,這裡就是設定生成的core檔案無大小限制。
三、生成core檔案
當第二步完成了,就執行一次那個有問題的程式,然後自然就會因為段錯誤而崩潰,在當前目錄下就生成了core.***檔案。
四、分析core檔案
使用命令$gdb 程式名 core.***,然後再輸入where就可以看到產生段錯誤的地方。
五、例項分析
1.test.c檔案的源**
1 void do_it();
2 int main() 3
7 void do_it() 8
2.編譯該源**,請注意,加-g標籤,可以在where命令後看到更加詳細的資訊。
執行編譯命令:$gcc -g ./test.c,看到如下列印
[michael
@localhost core_dump]$ gcc -g ./test.c
./test.c: in function 『do_it』:
./test.c:9:19: warning: initialization makes pointer from integer without a cast
[michael
@localhost core_dump]$
從而得到帶除錯資訊的(因為加了-g 編譯標籤)a.out二進位制檔案。3.設定core檔案大小限制為無限大。 執行命令:$ulimit -c unlimited,即可。4.生成core檔案。 執行命令:$./a.out,即可,可看到如下列印:
[michael
@localhost core_dump]$ ./a.out
segmentation fault (core dumped)
[michael
@localhost core_dump]$
執行命令:$ll,可看到如下列印:
[michael
@localhost core_dump]$ ll
total 80
-rwxrwxr-x. 1 michael michael 5612 may 2 15:54 a.out
-rw-------. 1 michael michael 204800 may 2 15:58 core.7369
-rw-rw-r--. 1 michael michael 383 may 2 15:53 test.c
[michael
@localhost core_dump]$
5.使用gdb除錯core檔案。 執行命令:$gdb ./a.out ./core.7369,可看到如下列印:
[michael
@localhost core_dump]$ gdb ./a.out ./core.7369
gnu gdb (gdb) fedora (7.2-52.fc14)
license gplv3+: gnu gpl version 3 or later
this is free software: you are free to change and redistribute it.
there is no warranty, to the extent permitted by law. type "show copying"
and "show warranty" for details.
this gdb was configured as "i686-redhat-linux-gnu".
for bug reporting instructions, please see:
...reading symbols from /home/michael/core_dump/a.out...done.
[new thread 7369]
missing separate debuginfo for
try: yum --disablerepo='*' --enablerepo='*-debuginfo' install /usr/lib/debug/.build-id/c4/1c574f31a203492b9389c783adad6ff1989915
reading symbols from /lib/libc.so.6...(no debugging symbols found)...done.
loaded symbols for /lib/libc.so.6
reading symbols from /lib/ld-linux.so.2...(no debugging symbols found)...done.
loaded symbols for /lib/ld-linux.so.2
core was generated by `./a.out'.
program terminated with signal 11, segmentation fault.
#0 0x080483b8 in do_it () at ./test.c:10
10 *p = 'a'; //真正產生段錯誤的在這裡,試圖更改位址1的值,此時核心會終止該程序,並且把core檔案dump出來
missing separate debuginfos, use: debuginfo-install glibc-2.13-2.i686
(gdb)
執行命令:where,即可看到出現段錯誤的行數了,如下列印:
(gdb) where
#0 0x080483b8 in do_it () at ./test.c:10
#1 0x0804839f in main () at ./test.c:4
(gdb)
在第10行,很容易吧。
使用 GDB 除錯 CoreDump 檔案
28 august 2011 寫c c 程式經常要直接和記憶體打交道,一不小心就會造成程式執行時產生segment fault而掛掉。一般這種情況都是因為陣列越界訪問,空指標或是野指標讀寫造成的。程式小的話還比較好辦,對著源 仔細檢查就能解決。但是對於 量較大的程式,裡邊包含n多函式呼叫,n多陣列指...
GDB除錯coredump檔案
linux上程式崩潰起來挺煩人,不過linux 比較好的是有gdb.echo ulimit c unlimited etc profile 然後記得敲入命令 source etc profile然後敲入命令 ulimit c效果如下 確認能否生成coredump檔案,使用如下命令 使用時注意,我在測...
gdb除錯coredump檔案
linux上程式崩潰起來挺煩人,不過linux 比較好的是有gdb.echo ulimit c unlimited etc profile 然後記得敲入命令 source etc profile然後敲入命令 ulimit c效果如下 確認能否生成coredump檔案,使用如下命令 使用時注意,我在測...