最近项目里遇到一个崩溃,不定期出现,很是头疼!今晚终于忍无可忍,下决心要干掉它!(于是用凉水洗了把脸,开始分析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. 快速部署Python应用:Nginx+uWSGI配置详解

    在PHP里,最方便的就是deployment了,只要把php文件丢到支持PHP的路径里面,然后访问那个路径就能使用了:无论给主机添加多少PHP应用,只要把目录改好就没你的事了,完全不用关心php-cg ...

  2. jQuery插件---轻量级的弹出窗口wBox

    Box Demo wBox——轻量级的弹出窗口jQuery插件,基于jQuery1.4.2开发,主要实现弹出框的效果,并且加入了很多有趣的功能,比如可img灯箱效果,callback函数,显示隐藏层, ...

  3. 一个web项目在myeclipse中add deployment时无法被识别出来的原因

    当我们一个web项目,在myeclipse中,add deployment时,可能发现,根本无法被识别成web项目,可能的原因有:   1. 项目的properties ->Myeclipse ...

  4. linux仅修改文件夹权限;linux 分别批量修改文件和文件夹权限

    比如我想把/var/www/html下的文件全部改成664,文件夹改成775,怎么做呢 方法一: 先把所有文件及文件夹改成664,然后把所有文件夹改成775 root@iZ25bq9kj7yZ:/ c ...

  5. Android命令行工具logcat详细用法!

    logcat是Android中一个命令行工具,可以用于得到程序的log信息. 见板凳详细说明!     本贴内容来自网络,引用网址为:http://hi.baidu.com/%C9%C1%D2%AB% ...

  6. gdb 远程调试android进程 -转

    什么是gdb 它是gnu组织开发的一个强大的unix程序调试工具,我们可以用它来调试Android上的C.C++代码. 它主要可以做4件事情: 随心所欲地启动你的程序. 设置断点,程序执行到断点处会停 ...

  7. cin 与 scanf 的不同

    cin输入更方便: 首先,cin 是个C++类型对象,它的类型是basic_istream,scanf 是个不定参数的函数,其次,cin 所属的类重载了 >> 运算符,使输入更简单了,比如 ...

  8. sdf SimpleDateFormat 不是线程安全的,

    我经常用一个public static SimpleDateFormat sdf; 今天发现报“java.lang.NumberFormatException: multiple points”的异常 ...

  9. 我想操作的是利用SqlDataAdapter的几个Command属性(InsertCommand,UpdateCommand,DeleteCommand)来更新数据库

    我想操作的是利用SqlDataAdapter的几个Command属性(InsertCommand,UpdateCommand,DeleteCommand)来更新数据库代码:SqlConnection ...

  10. javascript 对象的复制

    1. jQuery has a method that can be used to deep-clone objects, the$.extend() function. Let’s take a ...