首页
社区
课程
招聘
1
[原创]为什么我选择windbg而不是visual studio?
发表于: 2025-3-1 20:13 2356

[原创]为什么我选择windbg而不是visual studio?

2025-3-1 20:13
2356

问题背景
程序崩溃时,虽然在 Visual Studio 中能定位到崩溃发生的地方,但无法准确确定导致崩溃的具体对象。在调试过程中,堆栈信息只能显示出MainWindow的析构函数出现问题,而没有进一步的信息,无法确定是哪一个对象的析构导致了崩溃。
图片描述

问题分析
通过 Windbg,能够加载 QT 的符号文件,从而提供更详细的调试信息。通过查看 Windbg 的堆栈信息,我们能够定位到崩溃的根本原因:metaObject对象的无效堆内存。

图片描述
图片描述

从堆栈信息中可以看到,在MainWindow析构过程中,有一个成员对象的析构已经释放了内存,但父对象依然尝试访问这个已经释放的成员,导致了程序崩溃。

详细步骤与定位过程

  1. 定位崩溃对象
    • 崩溃发生时,通过 Windbg 定位到updateLivePlotPtChartTimer这个QTimer对象的析构时机。

      图片描述

    • 通过记录updateLivePlotPtChartTimer的地址(例如0x7ff6fd5a1fd8),设置断点并跟踪,发现它在析构时被访问。

      图片描述

  2. 堆栈分析
    • 通过堆栈追踪,可以看到MainWindow::~MainWindowdelete ui;时,updateLivePlotPtChartTimer已经析构。

    • 然而,之后的代码仍然调用了updateLivePlotPtChartTimer.disconnect(),此时内存已经无效,导致了metaObject对象的无效访问,从而触发了崩溃。

      图片描述

总结与解决方案
该问题的根本原因是,updateLivePlotPtChartTimer对象在析构后被错误地使用。为了避免此类问题,应该确保在析构对象之后,所有对该对象的引用都被清理或设为nullptr。此外,合理的资源管理(如使用智能指针)可以有效避免类似的内存访问错误。



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2025-3-2 12:35 被_THINCT编辑 ,原因: 补充图片
收藏
免费 1
支持
分享
赞赏记录
参与人
雪币
留言
时间
wx_茂斯
非常支持你的观点!
2025-3-11 08:07
最新回复 (4)
雪    币: 15
活跃值: (575)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不仅仅是这点,多线程的时候崩掉也只能靠windbg,vs根本断不到实际错误的地方
2025-3-1 21:14
0
雪    币: 4630
活跃值: (9031)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
vaguem 不仅仅是这点,多线程的时候崩掉也只能靠windbg,vs根本断不到实际错误的地方
嗯,赞同。
2025-3-2 19:03
0
雪    币: 187
活跃值: (2674)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
VS也有这个功能 你的符号没设置好而已 在设置调试里面
2025-3-10 15:06
0
雪    币: 0
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
5
有源码肯定vs
2025-3-11 07:00
1
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册