用gdb除錯core dump檔案

2021-06-27 00:04:04 字數 4464 閱讀 8838

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 這時候...