最近项目里遇到一个崩溃,不定期出现,很是头疼!今晚终于忍无可忍,下决心要干掉它!(于是用凉水洗了把脸,开始分析dump)希望凌晨的这篇总结对有相似经历的朋友有所启发!(看之前相关的几个dump可以猜到是有接口未释放的问题,但没有确认到底是哪个接口,本篇总结的主要目的是记录找到这个接口的过程)

 
用windbg打开dump文件,显示如下

 很明显是访问违例!从红框里的内容可知要取地址5bbc97f8的值,然后call之。但是5bbc97f8已经无效了!用!address 5bbc97f8来看下该地址的信息

可知该地址确实已经不在内存中了!对应的模块已经被卸载了!
 
至此,可以知道崩溃的原因了:模块被卸载后,还要执行其中的代码!下面让我们继续分析,为什么模块卸载后还会执行其中的代码!
先用.ecxr切到出问题的线程,然后用kpn看下调用栈,如下图

可以知道是某个线程在调用CoUninitialize,执行com的线程清理工作!frame 0的ole32!CStdMarshal::DisconnectSrvIPIDs调用导致了崩溃!看名字是要断开链接相关的!
ub 76f8bbe7 查看下崩溃前的几条指令

红框内的指令非常像COM函数(调用约定是stdcall) eax是com指针 ecx是虚表指针
dword ptr[ecx+8]是虚表中的第三项(32位下指针占4字节),回想IUnkown的前三个函数分别是QueryInterface AddRefRelease,可以基本确认这里是在调用Release(),跟上下文也很搭!我们的猜测99%是正确的!
 
我们先小小总结下:来龙去脉基本是这样的,我们使用了一个com接口,但是我们并没有释放,在调用CoUninitialize的时候,com做线程清理相关工作,当清理到我们的接口的时候,因为我们的dll已经被卸载了,导致了访问违例!下面我们的任务是找出到底是哪个接口没释放,然后对照代码验证我们的猜测是否正确!
 
先用lm a 5bbc97f8确认下该地址属于哪个模块

用命令.reload /f AccIME.dll=5bbb0000,5bbd8000-5bbb0000加载已经被卸载的模块及其对应的符号信息,并用lm vm AccIME确认

注意:如果遇到如下错误,说明我们符号加载的有问题,可以打开!sym noisy选项后看输出日志来排查,用完后可以用!sym quiet恢复,具体使用方法可通过.hh !sym查看帮助文档

 
接下来我们用ln 5bbc97f8查一下该地址附近对应的函数名

至此,我们可以看到是CCfgDpyScheme类相关的,可以把重点放到对此类的引用计数的使用上了!
本篇总结暂时写到这,还需要弄明白几个问题:
1. 涉及引用计数的相关代码是否有问题
2. 为什么有时候会崩溃,有时候不崩溃
 
 
有结果后会再发一篇总结,敬请期待!
 
 
 

[原]崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs的更多相关文章

  1. [原]调试实战——使用windbg调试崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs

    原调试debugwindbg崩溃crash 前言 最近程序会不定期崩溃,很是头疼!今晚终于忍无可忍,下决心要干掉它!从之前的几个相关的dump可以猜到是有接口未释放导致的问题,但没有确认到底是哪个接口 ...

  2. Windbg 内核态调试用户态程序然后下断点正确触发方法(亲自实现发现有效)

    先开启真机内核态kernel调试 !process 0 0 svchost.exe 找到进程cid的地址 然后进入 .process /p  fffffa8032be2870 然后 .process ...

  3. 关于iOS应用通过OpenURL在设置打开相机权限,然后原应用会立即崩溃(重启)的理解

    最近偶然发现的一个怪现象: 应用需要相机权限,如果检测到没有开启权限,我们代码内,通过openURL跳转设置界面 //打开应用设置 let url:NSURL = NSURL(string: UIAp ...

  4. [原]调试实战——使用windbg调试崩溃在ComFriendlyWaitMtaThreadProc

    原调试debugwindbgcrash崩溃COM 前言 这是几年前在项目中遇到的一个崩溃问题,崩溃在了ComFriendlyWaitMtaThreadProc()里,没有源码.耗费了我很大精力,最终通 ...

  5. [原]调试ComFriendlyWaitMtaThreadProc崩溃

    项目里安装了UIA相关的钩子来监听UIA相关事件,退出的时候偶尔会崩溃在ComFriendlyWaitMtaThreadProc中,如下  从上图可以看出 是访问到无效的地址了,用!address 0 ...

  6. (原)VS2013在Release情况下使用vector有时候会崩溃的一个可能原因

    转载请注明出处: http://www.cnblogs.com/darkknightzh/p/5016352.html 参考网址: http://www.cnblogs.com/BryZ/archiv ...

  7. (原)关于sdl在部分机器上做视频显示,改变显示窗口大小会崩溃

    今天测试人员反应,之前做的视频绘图显示,会在她机器上,会出现崩溃现象,最后我在她机器上对代码进行跟踪,发现在某种情况,确实会崩溃. 最主要的原因是,视频显示窗口变成非活动窗口的时候,sdl内部会循环消 ...

  8. [原]unity3D 移动平台崩溃信息收集

    http://m.blog.csdn.net/blog/catandrat111/8534287http://m.blog.csdn.net/blog/catandrat111/8534287

  9. 【原】AFNetworking源码阅读(三)

    [原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...

随机推荐

  1. Javascript面向对象编程(二):构造函数的继承

    这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有一个" ...

  2. HTML5来了:5个好用的混合式App开发工具

    在残酷的移动互联网竞争环境下, HTML5技术一直受到各方关注,“HTML5颠覆原生 App”的争论也从未停止过,不管怎样HTML5生态的构建方兴未艾.不过对于移动开发者来说更关心的问题是如何低成本. ...

  3. Nginx反向代理配置文件

    server { listen ; server_name ; root E:/Upays/public/; index index.php index.html; log_not_found off ...

  4. 转 Android:sp与dp(densityDpi与scaledDensity)

    一般在布局上设置控件大小维度的单位采用dp,而定义字体大小的单位采用sp. dp是dip,density independent pixel,即密度无关的像素单位,说白了,就是这个维度相对于不同屏幕的 ...

  5. 2016青岛网络赛 Sort

    Sort Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Des ...

  6. zencart的modules下数据库操作templates排版和common首页引用

    把这个学会,zencart的数据库操作,以及各种函数的调用基本会了 这个东西非常有用,你需要认真看一下,不要闲代码多. 如何在数据库中调出自己想要的产品,让它显示在首页. 据我本人不科学的理解,在in ...

  7. decimal 和 numeric (Transact-SQL)

    decimal(18,0)18是定点精度,0是小数位数.decimal(a,b)a指定指定小数点左边和右边可以存储的十进制数字的最大个数,最大精度38.b指定小数点右边可以存储的十进制数字的最大个数. ...

  8. Intellij Idea搭建java web项目(问题总结)

    这两天突发奇想下载了Intellij Idea,准备体验下这个传说中很强大IDE.工具下载就不多说了,网上一搜便知,博主是直接从Intellij官网下载的最新完整版,可惜的是只能使用30天,不过也差不 ...

  9. 省市二级联动--使用app-jquery-cityselect.js插件

    只有省市二级联动,三级联动还没处理好,会尽快完善. 嵌入id: <div class="form-group"> <label>地址</label&g ...

  10. linux iptables 相关设置

    首先在使用iptables之前敲入一下两条命令 > iptables -F   #这句话的意思是清空所有的链 > iptables -X  #这句话的意思是清空所有自定义的链 以上两条的含 ...