Debug 断言: Debug Assertion Failed!

昨天上司反馈,某项目的客户使用 我们 客户版的平台(智能卡的SDK) 做产品的压力测试 时,平台内置的一条指令执行 5000 次后,平台崩溃了,怀疑是 平台的内存管理 出现问题,而我,是刚接手这个平台的负责人(填补前人或自己后来留下的坑 与 项目功能新开发),于是从 SVN 上找到 当时客户版的工程源码,拉取到 本地磁盘,开始了填坑之旅:

1、其实在这之前,这个平台我已经接触过其它版本(内部版最强悍),所以工程设置和环境配置什么的没有再碰到问题。

2、但开头总是没那么顺利,当我配置好环境之后,在 Release 模式下运行(no problem),而在 Debug 模式下运行时,系统抛出异常 Debug Assertion Failed!,根据之前的经验,点击重试,IDE打开断言所在行(创建界面时分配新的工具栏空间有调用其构造函数CDockContext, “ASSERT(pBar != NULL);”和“ASSERT(pBar->m_pDockSite != NULL);”绿色右箭头停止在第二行,其实是第一行执行时就出现问题,pBar 不是空值),随后,从 View-Debug Windows 打开视窗 Call Stack ,这时可以看到最后调用了哪些函数,最上面一行是最后停止的位置,也就是刚才说的 “断言所在行”,逐层往下看,找到 非系统定义,而是自己定义的函数,发现是 CJLibrary 库的 EnableDocking 方法,在它里面创建 new 空间时,调用了构造函数,接着 我 又从 视窗 Call Stack 找到最后调用 EnableDocking 的位置(这时,其实 视窗 Call Stack 的任务已经结束了,剩下只能靠 我 自己去分析),然后看到最后这行是 m_wndDebugST.EnableDocking(...),全局搜索 m_wndDebugST,发现果然是个工具栏的对象,然后又 全局搜索相同的工具栏对象(因为经验告诉我,客户版是比内部版功能要少的,也许是删除工具栏资源后,当时的负责人没有删除干净),发现 m_wndDebugST 没有像其他的工具栏对象一样(它们调用了CreateEx和LoadToolBar)创建和加载(现在已经离问题很近了),然后我照猫画虎的对 m_wndDebugST 进行创建和加载,运行,还是断言,于是定神一看,发现 LoadToolBar 的参数,是一个控件的ID,这时就水落石出了,打开 .RC(资源文件),发现工具栏的控件里,果然缺少 所谓Debug的工具栏,为了验证最终设想是否正确,我创建了一个工具栏资源,并随意画了个控件图,保存之后,将其 控件ID 用于m_wndDebugST .LoadToolBar的参数,再次运行,没有出现Debug断言,运行成功

3、其实Debug断言,在C/C++的程序里,是经常出现的问题之一,下面我总结了解决的操作步骤:

        (1)第一时间想到问题可能的原因:野指针 或 内存溢出

        (2)再次复现Debug断言,点击重试,到“断言所在行”

        (3)从视窗 Call Stack找到最后调用的自定义函数,例如上面的 “CDockContext构造函数”

   (4)继续从 视窗 Call Stack 找到 最后调用 “CDockContext构造函数”的代码行,例如上面的“m_wndDebugST.EnableDocking(...)

        (5)从最后这行“m_wndDebugST.EnableDocking(...)”开始分析问题原因

4、文字排版后期再做优化,嘿嘿

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值