最近项目里遇到一个崩溃,不定期出现,很是头疼!今晚终于忍无可忍,下决心要干掉它!(于是用凉水洗了把脸,开始分析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. windows 系统注册dll文件

    使用管理员身份注册:命令提示符 管理员身份运行 32 位系统:regsvr32 %windir%\system32\jscript.dll 64 位系统:regsvr32 %windir%\SysWO ...

  2. RasterBandClass Class

    Product Availability Available with ArcGIS Engine, ArcGIS Desktop, and ArcGIS Server. Description Th ...

  3. angularJS 系列(六)---$emit(), $on(), $broadcast()的使用

    下面以一个例子来讲述 angular 中的event system,有$emit(), $on(), $broadcast().效果图如下 下面的代码中,用到了 controller AS 的语法,具 ...

  4. IP 网际协议

    1. IP数据首部长度: 4位版本号 : 4 位,用于标明 IP 版本号,0100 表示 IPv4,0110 表示 IPv6.目前常见的是 IPv4. 4位首部长度: 首部长度是占4位,可表示的最大十 ...

  5. ajax 跨域请求资源问题

    其实相当的简单:只需要在服务端设置一下响应头: header("Access-Control-Allow-Origin: *");就可以了!! nice,有木有? 下面两句也可以带 ...

  6. PL/SQL developer 管理多套数据库

    PL/SQL developer 管理多套数据库,作为一个统一的接口平台,连接多套数据库. 1.. 1.类SQL PLUS窗口:File->New->Command Window,这个类似 ...

  7. mkconfig文件解析

    #!/bin/sh -e #mkconfig 100ask24x0 arm arm920t 100ask24x0 Null s3c24x0#s0                     s1      ...

  8. PAT (Advanced Level) 1075. PAT Judge (25)

    简单模拟题. 注意一点:如果一个人所有提交的代码都没编译通过,那么这个人不计排名. 如果一个人提交过的代码中有编译不通过的,也有通过的,那么那份编译不通过的记为0分. #include<cstd ...

  9. 分享我们项目中基于EF事务机制的架构 【转载】

    http://www.cnblogs.com/leotsai/p/how-to-use-entity-framework-transaction-scope.html 写在前面: 1. 本文中单元测试 ...

  10. JAVA基础-抽象类

    1. 用abstract关键字来修饰一个类时, 这个类叫做抽象类, 用abstract修饰一个方法时, 该方法叫做抽象方法 2. 含有抽象方法的类必须被声明为抽象类, 3. 抽象类必须被继承, 抽象方 ...