采用qt+msvc编译的程序可以生成.pdb文件和捕捉异常dump文件来进行问题定位,qt+mingw编译的程序可以如下操作:
在.pro文件中添加:
QMAKE_CXXFLAGS_RELEASE = $$QMAKE_CXXFLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_CFLAGS_RELEASE = $$QMAKE_CLAGS_RELEASE_WITH_DEBUGINFO
QMAKE_LFLAGS_RELEASE = $$QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO
QT5可以不用在pro文件中添加以上代码,直接选择Profile编译,而不是Release编译,效果一样。
#ifdef Q_OS_WIN
long __stdcall callback(_EXCEPTION_POINTERS* excp)
{
CCrashStack crashStack(excp);
QString sCrashInfo = crashStack.GetExceptionInfo();
TCHAR my_documents[MAX_PATH];
SHGetFolderPath(NULL, CSIDL_DESKTOP, NULL, SHGFP_TYPE_CURRENT, my_documents);
QString file_path = QString::fromWCharArray(my_documents);
QDir *folder_path = new QDir;
bool exist = folder_path->exists(file_path.append("\\MyApp"));
if(!exist)
{
folder_path->mkdir(file_path);
}
delete folder_path;
folder_path = nullptr;
QString sFileName = file_path + "\\crash.log";
QFile file(sFileName);
if (file.open(QIODevice::WriteOnly|QIODevice::Truncate))
{
file.write(sCrashInfo.toUtf8());
file.close();
}
return EXCEPTION_EXECUTE_HANDLER;
}
#endif
int main(int argc, char *argv[])
{
#ifdef Q_OS_WIN
SetUnhandledExceptionFilter(callback);
#endif
QApplication a(argc, argv);
MainWindow w;
w.show();
QString *p = NULL;
p->clear();
return a.exec();
}
CCrashStack 类在示例程序中。
使用cmd命令 “objdump -S app.exe > app.asm” 生成汇编信息文件
查看crash.log里的 “Exception Addr: 004021D0” 在app.asm中查找相应地址
程序文件会比较大,发布的时候可以去掉.debug文件。