Chinaunix首页 | 论坛 | 博客
  • 博客访问: 304865
  • 博文数量: 174
  • 博客积分: 3061
  • 博客等级: 中校
  • 技术积分: 1740
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-04 22:43
文章分类

全部博文(174)

文章存档

2011年(54)

2010年(14)

2009年(30)

2008年(26)

2007年(27)

2006年(23)

我的朋友

分类: WINDOWS

2011-09-09 11:48:14

这几天同事处有一个crash,表现是在chrom的 test_shell 中打开一个flash网页,而这个flash是播放了一段广告,在广播播放完毕后这个flash控件就不见了。



使用到的flash控件是npsxxx.dll 这个是一个npapi的flash插件,由于没有发生在我的电脑上,所以只能描述一下排查的过程。



首先观察了几次发现,无论是否开启appverify都是必然crash的,当然在那个特定的flash htmlpage。

crash的时候在callstack中只有一行


clientebp          

0a670098      00000000




!analyze-v 之后也只是提示你不正确的eip指针, 同事特定的汇编代码是


move [esi+14h] , xxx      


而esi是fxxxxxxx 这个一个明显不应该是应用程序可以写入的一个地址。



然后反复观察了几次发现都是这样,现在唯一的线索是clientebp    

大家知道这个childebp表达的意思应该是当前层次的callstack的ebp寄存器值,相当于也是告诉你ebp在哪里?


而由于ebp是基于stack的函数调用分层次的边界,所以我就

dds ebp  

结果看到了很多npsxxx!XX  这样的函数,也就是说在发生crash的时候ebp的信息中还是看到之前发生了很多对npsxxx这个flash插件的调用。



因此就怀疑是这个插件引起了问题,然后做了一个实验,即禁止这个插件,结果果然crash就消失了。


但是由于没有插件的符号,从callstack中得不到更加深一步的信息了。


到了这儿如何解决问题,有点头痛了。

后来,我观察childebp这个值,0a670098   ,其实这个值也是现在从crash现场能够看到的唯一值了。   

然后lm 一下,发现这个地址不属于任何模块的加载范围,也不属于任何已经卸载模块的地址范围。


!address 这个地址,发现它是一个数据地址; 且在crash时候依然有效。

由于不知道crash之前到底发生了什么,这个问题其实还是很困扰的。


不过后来的解决办法,现在想来还算不错。因为这个时候最最需要知道的就是crash前的场景,所以当时在拥有的chrome处的和插件交互的npai模块的地方大量设置了断点,最后终于找到在一个插件销毁的地方有个delete this导致了这个问题,相当于可以理解为,a 调用了b,b把a删除了,当b返回后a自己crash了。







阅读(2467) | 评论(0) | 转发(0) |
0

上一篇:QML简介2

下一篇:一个log4cpp引起的crash

给主人留下些什么吧!~~