gdb基本的使用方法在此就不說了。
載入core檔案的命令行為:
dgb exe core
例如gdb ./testall ./core.2345
最重要的乙個命令是where,這個就像windbg的命令 !analyze -v
我模擬了幾個crash的情況,乙個乙個說。
第乙個:刪除兩次指標導致crash的情況
源程式char *a = new char[2];
delete a;
delete a;
執行時*** glibc detected *** ./testall: double free or corruption (fasttop): 0x09d7e008 ***
*****== backtrace: *****====
/lib/libc.so.6[0x1a6d35]
/lib/libc.so.6(cfree+0x59)[0x1aad29]
/usr/lib/libstdc++.so.6(_zdlpv+0x21)[0x683f5c1]
/usr/lib/libstdc++.so.6(_zdapv+0x1d)[0x683f61d]
./testall[0x804a518]
./testall[0x804a242]
./testall[0x80493e4]
./testall[0x80495e0]
./testall(__gxx_personality_v0+0x19f)[0x804906b]
/lib/libc.so.6(__libc_start_main+0xdc)[0x152ebc]
./testall(__gxx_personality_v0+0xb5)[0x8048f81]
*****== memory map: *****===
0013d000-00294000 r-xp 00000000 fd:00 12815259 /lib/libc-2.5.so
00294000-00296000 r-xp 00157000 fd:00 12815259 /lib/libc-2.5.so
00296000-00297000 rwxp 00159000 fd:00 12815259 /lib/libc-2.5.so
00297000-0029a000 rwxp 00297000 00:00 0
0089a000-008a5000 r-xp 00000000 fd:00 12815281 /lib/libgcc_s-4.1.2-20080825.so.1
008a5000-008a6000 rwxp 0000a000 fd:00 12815281 /lib/libgcc_s-4.1.2-20080825.so.1
00b52000-00b6d000 r-xp 00000000 fd:00 12815258 /lib/ld-2.5.so
00b6d000-00b6e000 r-xp 0001a000 fd:00 12815258 /lib/ld-2.5.so
00b6e000-00b6f000 rwxp 0001b000 fd:00 12815258 /lib/ld-2.5.so
00b94000-00b95000 r-xp 00b94000 00:00 0 [vdso]
00cd0000-00cf7000 r-xp 00000000 fd:00 12815266 /lib/libm-2.5.so
00cf7000-00cf8000 r-xp 00026000 fd:00 12815266 /lib/libm-2.5.so
00cf8000-00cf9000 rwxp 00027000 fd:00 12815266 /lib/libm-2.5.so
00d17000-00d2d000 r-xp 00000000 fd:00 12815261 /lib/libpthread-2.5.so
00d2d000-00d2e000 r-xp 00015000 fd:00 12815261 /lib/libpthread-2.5.so
00d2e000-00d2f000 rwxp 00016000 fd:00 12815261 /lib/libpthread-2.5.so
00d2f000-00d31000 rwxp 00d2f000 00:00 0
0678c000-0686c000 r-xp 00000000 fd:00 12690777 /usr/lib/libstdc++.so.6.0.8
0686c000-06870000 r-xp 000df000 fd:00 12690777 /usr/lib/libstdc++.so.6.0.8
06870000-06871000 rwxp 000e3000 fd:00 12690777 /usr/lib/libstdc++.so.6.0.8
06871000-06877000 rwxp 06871000 00:00 0
08048000-0804e000 r-xp 00000000 fd:00 6127658 /home/zhaha05/test/testall/testall
0804e000-0804f000 rw-p 00005000 fd:00 6127658 /home/zhaha05/test/testall/testall
09d7e000-09d9f000 rw-p 09d7e000 00:00 0 [heap]
b7f36000-b7f38000 rw-p b7f36000 00:00 0
b7f48000-b7f4b000 rw-p b7f48000 00:00 0
bf8da000-bf8ef000 rw-p bffe9000 00:00 0 [stack]
aborted (core dumped)
gdb除錯core檔案時
warning: .dynamic section for "/lib/libc.so.6" is not at the expected address
第二個:空指標
源程式char *nullpointer = null;
strcpy(nullpointer,"12334567890");
執行時segmentation fault (core dumped)
gdb除錯時
program terminated with signal 11, segmentation fault.
#0 0x0804a48e in file_open_rha_test_c::testmethod (this=0x84e1108, parser=...)
at file.cpp:23
23 strcpy(nullpointer,"12334567890");
第三個:buffer overflow
源程式char overflow[1];
strcpy(overflow,"1234567890");
執行時segmentation fault
gdb除錯時
program terminated with signal 11, segmentation fault.
#0 0x0683a919 in __gnu_cxx::__exchange_and_add(int volatile*, int) ()
from /usr/lib/libstdc++.so.6
(gdb) where
#0 0x0683a919 in __gnu_cxx::__exchange_and_add(int volatile*, int) ()
from /usr/lib/libstdc++.so.6
#1 0x0681ed24 in std::basic_string, std::allocator>::~basic_string() () from /usr/lib/libstdc++.so.6
#2 0x0804a4d1 in file_open_rha_test_c::testmethod (this=0x8e7f108, parser=...)
at file.cpp:24
#3 0x0804a1e2 in rha_test_case_c::run_command (command=0x8e7f2cc "file.open",
parser=...) at shell_test.h:194
#4 0x08049384 in shell_test_c::execute_command (
cmd=0xbff0bd54 "file.open t.txt") at shell_test.cpp:68
#5 0x08049580 in shell_test_c::go (this=0xbff0c58c, argc=1, argv=0xbff0c634)
at shell_test.cpp:107
#6 0x0804900b in main (argc=1, argv=0xbff0c634) at main.cpp:7
用gdb除錯core dump檔案
在unix系統下,應用程式崩潰,一般會產生core檔案,如何根據core檔案查詢問題的所在,並做相應的分析和除錯,是非常重要的。什麼是core dump?core的意思是記憶體,dump的意思是扔出來,堆出來.開發和使用unix程式時,有時程式莫名其妙的down了,卻沒有任何的提示 有時候會提示co...
用gdb除錯coredump檔案
在unix系統下,應用程式崩潰,一般會產生core檔案,如何根據core檔案查詢問題的所在,並做相應的分析和除錯,是非常重要的。什麼是core dump?core的意思是記憶體,dump的意思是扔出來,堆出來.開 發和使用unix程式時,有時程式莫名其妙的down了,卻沒有任何的提示 有時候會提示c...
用gdb除錯core dump檔案
在unix系統下,應用程式崩潰,一般會產生core檔案,如何根據core檔案查詢問題的所在,並做相應的分析和除錯,是非常重要的。core的意思是記憶體,dump的意思是扔出來,堆出來.開發和使用unix程式時,有時程式莫名其妙的down了,卻沒有任何的提示 有時候會提示core dumped 這時候...