Qt软件调试技巧

Posted

技术标签:

【中文标题】Qt软件调试技巧【英文标题】:Qt software debugging techniques 【发布时间】:2019-02-21 20:00:26 【问题描述】:

我有应用程序发布到Microsoft Store,在Dev center 应用程序的健康页面下,它报告崩溃问题:

fail_fast_fatal_app_exit_c0000409_qt5core.dll!qt_logging_to_console

还有堆栈跟踪:

0   ucrtbase.dll    abort   0x000000000000004E
1   Qt5Core.dll qt_logging_to_console   0x000000000000017A
2   Qt5Core.dll QMessageLogger::fatal   0x0000000000000093
3   Qt5Gui.dll  QPixmap::paintEngine    0x0000000000000052
4   Qt5Gui.dll  QPixmap::QPixmap    0x0000000000000037

在调试应用程序时,我没有遇到任何崩溃。问题是如何通过堆栈跟踪获取代码中的崩溃位置或函数行/名称?有任何想法吗?谢谢。

【问题讨论】:

1) 使用调试符号构建您的代码。 2) 确保你说调试符号可用。 @JesperJuhl 嗨!你说的选项2是什么意思?我有项目 .pdb 文件。 堆栈跟踪仅指向 Qt 函数。是否完整?你的代码函数在哪里? @vahancho 嗨!它没有显示我的任何代码功能。如果我知道函数名称,那么在这里创建主题就没有意义了。谢谢。 【参考方案1】:

十六进制看起来像一些偏移量,可能从函数开始,因为它们很小。您可以下载并编译 dia2dump 实用程序(它也在 VS 示例中的某个位置),它可以转储大量有关调试符号的信息,包括每个偏移量的行号。所以你会知道堆栈的行号。

请注意,您需要 Qt 的 pdb,而不是您的程序的 pdb,才能调查此堆栈。

【讨论】:

【参考方案2】:

我认为问题在于即时创建/销毁程序图标,DestroyIcon 销毁了正在使用的句柄。

我添加了一些改进,现在它只创建了HICONQPixmap 的1 个对象,然后附加到循环中的结构,循环退出后它调用DestroyIcon 函数来销毁HICON 句柄。

我还发现了这篇关于从 Microsoft Store 中查找错误的文章: How to get a crash dump (or any usable crash report) for a converted Windows Store UWP app?

但我也会尝试StackWalker 应用程序来检查其他问题。谢谢。

【讨论】:

以上是关于Qt软件调试技巧的主要内容,如果未能解决你的问题,请参考以下文章

Windows下软件调试

Qt入门教程Core篇断点调试及调试技巧

Visual Studio调试效率技巧

Qt界面程序调试器:Gammaray介绍

Qt Creator的CDB调试器--使用技巧与解决调试很慢的心得,重点是Symbols Path设置

VS2010常用调试技巧