Qt之程序崩溃原因定位手段

	由于Qt主要作为跨平台的界面库存在,在Linux环境下定位问题较Windows下难,记录下已知的Linux环境下Qt程序崩溃原因定位的方法。
	可能更多还是(https://forum.qt.io/topic/5036/generic-advice-capture-core-dump) 这里面提到的core和3rd library吧。
	
	(1) Linux core文件定位
		Step1.打开coredump功能 ulimit -S -c unlimited /dev/null 2>&1
		Step2.将上面命令添加到启动脚本中.
		Step3.在收集到core文件后,拷贝gdb程序和其依赖库/libexpat.so.0到设备中,进行调试.
	
	(2) backtrace信息定位 (https://blog.csdn.net/gongmin856/article/details/79192259)
		补入以下代码,测试时文本有乱码,待解决.qt里最好单独写个头文件用extern C {}强制按照c编译.
		#include <execinfo.h> 
		#include <unistd.h> 
		#include <signal.h> 
		#include <sys/types.h> 
		#include <sys/stat.h>
		#include <fcntl.h>
		void printDumpInfo(){
		int j,nptrs;
		void* buffer[SIZE];
		char** strings;
		char buff[SIZE];
		nptrs = backtrace(buffer,SIZE);
		strings = backtrace_symbols(buffer,nptrs);
		if (NULL == strings){perror("backtrace_symbols");exit(EXIT_FAILURE);}
		int fd,size;
		fd = open("backtrace",O_RDWR | O_CREAT | O_TRUNC);
		if (-1 == fd){perror("open failed");exit(-1);}
		for(j = 0; j < nptrs; j++){sprintf(buff,"%s\n",strings[j]);write(fd,buff,sizeof(buff));}
		close(fd);free(strings);
		}
		void dumpBackTrace(int signum){signal(signum,SIG_DFL);printDumpInfo()}
		void registerSigHandler(){signal(SIGSEGV,dumpBackTrace);signal(SIGABRT,dumpBackTrace);signal(SIGFPE,dumpBackTrace);}
		然后在main函数中注册信号处理函数即可。
	
	(3) Breakpad与qBreakpad
	但是breakpad/qBreakpad需要编译器支持c++11,但工作环境不允许,所以暂时不深入研究下去。
	
	(4) crashpad
	仅支持mac和window,不支持linux,所以不展开,知道有这个东西即可。
	
	[breakpad包地址](https://github.com/google/breakpad)
	[breakpad相关资料](https://www.freesion.com/article/2315452775/)
	[qBreakpad相关资料](https://github.com/buzzySmile/qBreakpad https://blog.csdn.net/weixin_40774605/article/details/110970802)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值