由于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)
Qt之程序崩溃原因定位手段
于 2022-01-22 20:50:56 首次发布