在 Linux 上将 Crashpad 与 Qt 集成
Posted
技术标签:
【中文标题】在 Linux 上将 Crashpad 与 Qt 集成【英文标题】:Integrating Crashpad with Qt on Linux 【发布时间】:2021-07-02 12:51:28 【问题描述】:我正在尝试将 Crashpad 集成到 Linux 上的 Qt 应用程序中。我正在使用 Bugsplat 数据库进行测试,我遵循 this tutorial 并设法构建了 this "dummy" application,它应该作为使用 Qt 和 Crashpad 的示例。
我对文件进行了细微调整以修复我的 Linux 平台的构建,主要是使版本更改更容易,并修复了在应用程序二进制文件旁边创建目录和 crashpad 文件的问题。
所有更改都在下面作为差异文件列出:
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.com 和 Flintstone 作为密码),我设法报告了崩溃,但我出于某种原因,该错误不包含上传的符号。我尝试使用dump_syms
手动上传它们,然后通过向https://fred.bugsplat.com/post/bp/symbol/breakpadsymbols.php?appName=myQtCrasher&appVer=4.9
发送请求来使用symupload
应用程序,但没有成功。
symupload
应用程序输出是
Failed to open curl lib from binary, use libcurl.so instead
Successfully sent the symbol file.
如何正确上传*.sym
并在崩溃时查看堆栈跟踪?
感谢您的帮助!
【问题讨论】:
嗨@Brkyz,你能发邮件给support@bugsplat.com吗?这将帮助我们使用我们的支持工具跟踪您的问题,以便我们可以帮助您使您的集成正常工作???? 【参考方案1】:我们能够为这个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 文件,但根据相应的可执行文件命名。
【讨论】:
我没有更改 bash 脚本中的app
和 sym
变量,只添加了 echo
用于打印 url。我将检查上传文件的名称并在此处提供反馈。非常感谢您的帮助!
不客气!绝对有可能我们犯了错误。如果您发现我们的脚本有问题(或者如果我们的后端无法正确处理某些内容),请给我们发送电子邮件或通过 bugsplat.com 上的应用内聊天向我们发送消息。
我试图在脚本或我的应用程序中找到问题,但没有成功。我尝试通过myQtCrasher/Crashpad/Tools/Linux/symupload ./myQtCrasher.sym "http://Fred.bugsplat.com/post/bp/symbol/breakpadsymbols.php?appName=myQtCrasher&appVer=1.0"
手动上传,但结果是一样的。看起来dump_symbs
在符号的第一行生成带有myQtCrasher.debug
的符号。从*.debug
生成任何符号文件会在第一行自动生成*.debug
。也许调试不应该是分开的文件?
从一个单独的 .debug 文件中转储符号用于工作。也许自从我们上次调查以来功能已经改变?您可以尝试删除 Qt pro 文件中创建单独 .debug 文件的行,看看是否有帮助。在我们调查问题时,您还可以编写一个脚本来重命名文件并从模块名称中删除 .debug 作为解决方法。能否请您发送电子邮件至 support@bugsplat.com,以便我们跟踪此问题并安排工程时间来调查此问题?谢谢!以上是关于在 Linux 上将 Crashpad 与 Qt 集成的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 10 上将 Quazip 与 Qt 5.6、Qt Creator 一起使用?