在 Linux 上将 Crashpad 与 Qt 集成

问题描述

我正在尝试将 Crashpad 集成到 Linux 上的 Qt 应用程序中。我正在使用 Bugsplat 数据库进行测试,我遵循 this tutorial 并设法构建了 this "dummy" application,这应该作为将 Qt 与 Crashpad 结合使用的示例。

我对文件进行了细微调整以修复我的 Linux 平台的构建,主要是使版本更改更容易,并修复了在应用程序二进制文件旁边创建目录和崩溃板文件的问题。

所有更改都在下面作为差异文件列出:

diff --git a/Crashpad/Tools/Linux/symbols.sh b/Crashpad/Tools/Linux/symbols.sh
index 095f295..b065438 100644
--- a/Crashpad/Tools/Linux/symbols.sh
+++ b/Crashpad/Tools/Linux/symbols.sh
@@ -3,6 +3,6 @@ symupload="${1}/Crashpad/Tools/Linux/symupload"
 app="${2}/${4}.debug"
 sym="${4}.sym"
 url="https://${3}.bugsplat.com/post/bp/symbol/breakpadsymbols.PHP?appName=${4}&appVer=${5}"
-
+echo ${url}
 eval "${dump_syms} ${app} > ${sym}"
 eval $"${symupload} \"${sym}\" \"${url}\""
diff --git a/main.cpp b/main.cpp
index db97dd4..b721dc5 100644
--- a/main.cpp
+++ b/main.cpp
@@ -26,7 +26,7 @@ int main(int argc,char *argv[])
 {
     QString dbname = "Fred";
     QString appName = "myQtCrasher";
-    QString appVersion = "1.0";
+    QString appVersion = QString::number(MAJOR_VERSION) + "." + QString::number(MInor_VERSION);
 
     initializeCrashpad(dbname,appName,appVersion);
 
diff --git a/myQtCrasher.pro b/myQtCrasher.pro
index 3005e41..3bf7a3e 100644
--- a/myQtCrasher.pro
+++ b/myQtCrasher.pro
@@ -15,6 +15,12 @@ DEFInes += QT_DEPRECATED_WARNINGS
 # You can also select to disable deprecated APIs only up to a certain version of Qt.
 #DEFInes += QT_disABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
 
+MAJOR_VERSION = 4
+MInor_VERSION = 9
+
+DEFInes += MAJOR_VERSION=$$MAJOR_VERSION
+DEFInes += MInor_VERSION=$$MInor_VERSION
+
 SOURCES += \
     main.cpp \
     mainwindow.cpp \
@@ -94,7 +100,8 @@ linux {
     LIBS += -L$$PWD/Crashpad/Libraries/Linux/ -lbase
 
     # copy crashpad_handler to build directory and run dump_syms and symupload
-    QMAKE_POST_LINK += "cp $$PWD/Crashpad/Bin/Linux/crashpad_handler $$OUT_PWD/crashpad"
-    QMAKE_POST_LINK += "&& bash $$PWD/Crashpad/Tools/Linux/symbols.sh $$PWD $$OUT_PWD fred myQtCrasher 1.0 > $$PWD/Crashpad/Tools/Linux/symbols.out 2>&1"
-    QMAKE_POST_LINK += "&& cp $$PWD/Crashpad/attachment.txt $$OUT_PWD/attachment.txt"
+    QMAKE_POST_LINK += "mkdir $$OUT_PWD/crashpad"
+    QMAKE_POST_LINK += "&& cp $$PWD/Crashpad/Bin/Linux/crashpad_handler $$OUT_PWD/crashpad"
+    QMAKE_POST_LINK += "&& bash $$PWD/Crashpad/Tools/Linux/symbols.sh $$PWD $$OUT_PWD fred myQtCrasher $$MAJOR_VERSION"."$$MInor_VERSION > $$PWD/Crashpad/Tools/Linux/symbols.out 2>&1"
+#    QMAKE_POST_LINK += "&& cp $$PWD/Crashpad/attachment.txt $$OUT_PWD/attachment.txt" #if any attachment is needed
 }

Build 生成 myQtCrasher.debug 和外部生成myQtCrasher.sym 符号文件

使用他们的 dummy database(信用是 fred@bugsplat.comFlintstone 作为密码),我设法报告了崩溃,但我为出于某种原因,该错误不包含上传的符号。我尝试通过将请求发送到 dump_syms 来手动使用 symuploadhttps://fred.bugsplat.com/post/bp/symbol/breakpadsymbols.PHP?appName=myQtCrasher&appVer=4.9 应用程序上传它们,但没有成功。

symupload 应用程序输出

Failed to open curl lib from binary,use libcurl.so instead
Successfully sent the symbol file.

如何正确上传 *.sym 并在崩溃时查看堆栈跟踪?

感谢您的帮助!

解决方法

我们能够为这个 crash report 解析符号。在 symupload 警告 Failed to open curl lib from binary,use libcurl.so instead 之后,它说成功发送了符号文件。我确认符号文件已正确上传。

我发现符号文件有 2 个问题。当 minidump_stackwalk 正在寻找它正在寻找的相应符号时:

/myQtCrasher-4.9/myQtCrasher/C03D64A46AB29A093459A592482836E50/myQtCrasher.sym

上传到 BugSplat 的文件是 myQtCrasher.debug.sym,sym 文件第一行的模块是 myQtCrasher.debug。我将文件名更改为 myQtCrasher.sym,将模块名称更改为 myQtCrasher,myQtCrasher 堆栈帧的符号显示了函数名称和行号。

我不确定这些符号不匹配的问题是否是由于您的脚本更改造成的,但我们的脚本似乎试图设置以下变量:

app="${2}/${4}.debug"
sym="${4}.sym"

因此脚本期望用户从 .debug 文件生成 sym 文件,但根据相应的可执行文件命名它们。