Linux下的C++程序崩溃时打印崩溃信息

来源:互联网 发布:音乐后期制作软件手机 编辑:程序博客网 时间:2024/05/17 21:55

概述

在某些极端情况下,原本正常执行的程序发生了崩溃。这时候想通过调试是很难发现出错的地方的,所以在崩溃时打印出错点的调用堆栈是十分有必要的。

使用的命令:catchsegv program [args]
例如:我们的程序是test,则可在控制台输入:catchsegv ./test
如果使用gcc/g++编译test时添加了-g选项(即在可执行程序中加入调试信息),则可以输出崩溃的代码行数。

测试

有如下C++代码(test.cpp):

int main(){    int* nInt = 0;    *nInt = 0; // crash    return 0;}

使用g++ test.cpp -o test -g编译此段C++代码,生成test可执行程序。在控制台执行catchsegv ./test,则有如下输出(注意Backtrace:下的):

Segmentation fault (core dumped)*** Segmentation faultRegister dump: RAX: 0000000000000000   RBX: 0000000000000000   RCX: 0000000000000000 RDX: 00007ffc56abf9a8   RSI: 00007ffc56abf998   RDI: 0000000000000001 RBP: 00007ffc56abf8b0   R8 : 00007f20269bce80   R9 : 00007f2026bd7560 R10: 00007ffc56abf740   R11: 00007f202661edd0   R12: 0000000000400400 R13: 00007ffc56abf990   R14: 0000000000000000   R15: 0000000000000000 RSP: 00007ffc56abf8b0 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: 00000000000000000000000000000000Backtrace:??:?(main)[0x4004fd]/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf5)[0x7f202661eec5]??:?(_start)[0x400429]Memory map:00400000-00401000 r-xp 00000000 08:01 4736094 /home/jackripper/Desktop/test00600000-00601000 r--p 00000000 08:01 4736094 /home/jackripper/Desktop/test00601000-00602000 rw-p 00001000 08:01 4736094 /home/jackripper/Desktop/test01ee0000-01f05000 rw-p 00000000 00:00 0 [heap]7f20263e7000-7f20263fd000 r-xp 00000000 08:01 1445862 /lib/x86_64-linux-gnu/libgcc_s.so.17f20263fd000-7f20265fc000 ---p 00016000 08:01 1445862 /lib/x86_64-linux-gnu/libgcc_s.so.17f20265fc000-7f20265fd000 rw-p 00015000 08:01 1445862 /lib/x86_64-linux-gnu/libgcc_s.so.17f20265fd000-7f20267b8000 r-xp 00000000 08:01 1441892 /lib/x86_64-linux-gnu/libc-2.19.so7f20267b8000-7f20269b7000 ---p 001bb000 08:01 1441892 /lib/x86_64-linux-gnu/libc-2.19.so7f20269b7000-7f20269bb000 r--p 001ba000 08:01 1441892 /lib/x86_64-linux-gnu/libc-2.19.so7f20269bb000-7f20269bd000 rw-p 001be000 08:01 1441892 /lib/x86_64-linux-gnu/libc-2.19.so7f20269bd000-7f20269c2000 rw-p 00000000 00:00 07f20269c2000-7f20269c6000 r-xp 00000000 08:01 1441886 /lib/x86_64-linux-gnu/libSegFault.so7f20269c6000-7f2026bc5000 ---p 00004000 08:01 1441886 /lib/x86_64-linux-gnu/libSegFault.so7f2026bc5000-7f2026bc6000 r--p 00003000 08:01 1441886 /lib/x86_64-linux-gnu/libSegFault.so7f2026bc6000-7f2026bc7000 rw-p 00004000 08:01 1441886 /lib/x86_64-linux-gnu/libSegFault.so7f2026bc7000-7f2026bea000 r-xp 00000000 08:01 1441885 /lib/x86_64-linux-gnu/ld-2.19.so7f2026dca000-7f2026dcd000 rw-p 00000000 00:00 07f2026de7000-7f2026de9000 rw-p 00000000 00:00 07f2026de9000-7f2026dea000 r--p 00022000 08:01 1441885 /lib/x86_64-linux-gnu/ld-2.19.so7f2026dea000-7f2026deb000 rw-p 00023000 08:01 1441885 /lib/x86_64-linux-gnu/ld-2.19.so7f2026deb000-7f2026dec000 rw-p 00000000 00:00 07ffc56aa0000-7ffc56ac1000 rw-p 00000000 00:00 0 [stack]7ffc56ba7000-7ffc56ba9000 r-xp 00000000 00:00 0 [vdso]7ffc56ba9000-7ffc56bab000 r--p 00000000 00:00 0 [vvar]ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
0 0
原创粉丝点击