在某些極端情況下,原本正常執行的程式發生了崩潰。這時候想通過除錯是很難發現出錯的地方的,所以在崩潰時列印出錯點的呼叫堆疊是十分有必要的。
使用的命令: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...