Linux下的C 程式崩潰時列印崩潰資訊

2021-07-12 06:01:48 字數 4924 閱讀 2850

在某些極端情況下,原本正常執行的程式發生了崩潰。這時候想通過除錯是很難發現出錯的地方的,所以在崩潰時列印出錯點的呼叫堆疊是十分有必要的。

使用的命令:catchsegv program [args]

例如:我們的程式是test,則可在控制台輸入:catchsegv ./test

如果使用gcc/g++編譯test時新增了-g選項(即在可執行程式中加入除錯資訊),則可以輸出崩潰的**行數。

有如下c++**(test.cpp):

int main()

使用g++ test.cpp -o test -g編譯此段c++**,生成test可執行程式。在控制台執行catchsegv ./test,則有如下輸出(注意backtrace:下的):

segmentation fault (core dumped)

*** segmentation fault

register dump:

rax: 0000000000000000 rbx: 0000000000000000 rcx: 0000000000000000

rdx: 00007fff296866f8 rsi: 00007fff296866e8 rdi: 0000000000000001

rbp: 00007fff29686600 r8 : 00007f0072412e80 r9 : 00007f007262d700

r10: 00007fff29686490 r11: 00007f0072070e50 r12: 0000000000400400

r13: 00007fff296866e0 r14: 0000000000000000 r15: 0000000000000000

rsp: 00007fff29686600

rip: 00000000004004fd eflags: 00010246

cs: 0033 fs: 0000 gs: 0000

trap: 0000000e error: 00000006 oldmask: 00000000 cr2: 00000000

fpucw: 0000037f fpusw: 00000000 tag: 00000000

rip: 00000000 rdp: 00000000

st(0) 0000

0000000000000000 st(1) 0000

0000000000000000

st(2) 0000

0000000000000000 st(3) 0000

0000000000000000

st(4) 0000

0000000000000000 st(5) 0000

0000000000000000

st(6) 0000

0000000000000000 st(7) 0000

0000000000000000

mxcsr: 1f80

xmm0: 00000000000000000000000000000000 xmm1: 00000000000000000000000000000000

xmm2: 00000000000000000000000000000000 xmm3: 00000000000000000000000000000000

xmm4: 00000000000000000000000000000000 xmm5: 00000000000000000000000000000000

xmm6: 00000000000000000000000000000000 xmm7: 00000000000000000000000000000000

xmm8: 00000000000000000000000000000000 xmm9: 00000000000000000000000000000000

xmm10: 00000000000000000000000000000000 xmm11: 00000000000000000000000000000000

xmm12: 00000000000000000000000000000000 xmm13: 00000000000000000000000000000000

xmm14: 00000000000000000000000000000000 xmm15: 00000000000000000000000000000000

backtrace:

/home/jackripper/desktop/test.cpp:7(main)[0x4004fd]

/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7f0072070f45]

??:?(_start)[0x400429]

memory map:

00400000-00401000 r-xp 00000000

08:01

4723165 /home/jackripper/desktop/test

00600000-00601000 r--p 00000000

08:01

4723165 /home/jackripper/desktop/test

00601000-00602000 rw-p 00001000

08:01

4723165 /home/jackripper/desktop/test

01ab6000-01adb000 rw-p 00000000

00:00

0 [heap]

7f0071e39000-7f0071e4f000 r-xp 00000000

08:01

1445862 /lib/x86_64-linux-gnu/libgcc_s.so.1

7f0071e4f000-7f007204e000 ---p 00016000

08:01

1445862 /lib/x86_64-linux-gnu/libgcc_s.so.1

7f007204e000-7f007204f000 rw-p 00015000

08:01

1445862 /lib/x86_64-linux-gnu/libgcc_s.so.1

7f007204f000-7f007220d000 r-xp 00000000

08:01

1443885 /lib/x86_64-linux-gnu/libc-2.19.so

7f007220d000-7f007240d000 ---p 001be000 08:01

1443885 /lib/x86_64-linux-gnu/libc-2.19.so

7f007240d000-7f0072411000 r--p 001be000 08:01

1443885 /lib/x86_64-linux-gnu/libc-2.19.so

7f0072411000-7f0072413000 rw-p 001c2000 08:01

1443885 /lib/x86_64-linux-gnu/libc-2.19.so

7f0072413000-7f0072418000 rw-p 00000000

00:00

07f0072418000-7f007241c000 r-xp 00000000

08:01

1443877 /lib/x86_64-linux-gnu/libsegfault.so

7f007241c000-7f007261b000 ---p 00004000

08:01

1443877 /lib/x86_64-linux-gnu/libsegfault.so

7f007261b000-7f007261c000 r--p 00003000

08:01

1443877 /lib/x86_64-linux-gnu/libsegfault.so

7f007261c000-7f007261d000 rw-p 00004000

08:01

1443877 /lib/x86_64-linux-gnu/libsegfault.so

7f007261d000-7f0072640000 r-xp 00000000

08:01

1443901 /lib/x86_64-linux-gnu/ld-2.19.so

7f0072818000-7f007281b000 rw-p 00000000

00:00

07f007283d000-7f007283f000 rw-p 00000000

00:00

07f007283f000-7f0072840000 r--p 00022000

08:01

1443901 /lib/x86_64-linux-gnu/ld-2.19.so

7f0072840000-7f0072841000 rw-p 00023000

08:01

1443901 /lib/x86_64-linux-gnu/ld-2.19.so

7f0072841000-7f0072842000 rw-p 00000000

00:00

07fff29668000-7fff29689000 rw-p 00000000

00:00

0 [stack]

7fff29797000-7fff29799000 r--p 00000000

00:00

0 [vvar]

7fff29799000-7fff2979b000 r-xp 00000000

00:00

0 [vdso]

ffffffffff600000-ffffffffff601000 r-xp 00000000

00:00

0 [vsyscall]

linux下 c程式崩潰時產生core檔案的設定

c程式執行崩潰時,如果能夠自動產生core檔案,會對問題的分析和定位有一定的幫助,但是需要一定的設定才可以開啟該選項 如果程式本身有問題,在崩潰時,可能會產生core檔案 注意 不是一定會產生的 產生的core檔案預設是在執行檔案的目錄下,但也可以指定 修改 etc security limits....

C 記錄程式崩潰時的dumpfile

新上線的軟體在外場偶爾會出現異常崩潰的情況。由於試用範圍比較分散,很難一一前往現場定位問題。而傳統的log日誌方法,在崩潰的情況下,並不能比較準確的表示出問題位置,這使得軟體除錯程序緩慢。後在公司前輩的指點下,我們想到了使用window自帶的dumpfile來記錄崩潰時刻的堆疊資訊,這樣配合log日...

linux下監控程式並崩潰重啟

if test pgrep f 1 wc l eq 0 then echo 程序不存在 else echo 存在程序 fi執行 crontab e 裡面輸入 1 bin bash home automonitor.sh 代表一分鐘執行一次指令碼 bin sh serverpid ps aux gre...