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
销毁了正在使用的句柄。
我添加了一些改进,现在它只创建了HICON
和QPixmap
的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软件调试技巧的主要内容,如果未能解决你的问题,请参考以下文章