缘起

最近,我们程序的某个功能在一台机器上不正常,但是在另外一台机器上却是正常的。代码是同一份,vs版本也一样(打的补丁也一样)。编译出来的程序在两台电脑上运行的结果就是不一样。惊不惊喜,意不意外?如果是你遇到了这种情况,你会怎么调查呢?????

说明:

为了跟大家分享这个问题,我事后在自己的机器上重新把整个过程梳理了一遍,并保存了process monitor抓取的事件文件,方便感兴趣的读者亲手做实验。

为了行文方便,下文把程序功能正常的电脑称作A,把程序功能不正常的电脑称作B

排查问题

通过对比程序在两台电脑上的运行过程的不同点可以比较有效的解决这种问题。

下面是我的思路:

  • 首先,排除代码不一致的问题。把A上的代码拷贝到B上,编译,运行,功能不正常。

  • A上的整个Debug目录(程序所在的目录)拷贝到B上,运行,依然不正常。

  • 对比两台电脑上的环境变量,排除两台电脑的环境变量不一致导致的问题(尤其是PATH,会影响dll加载顺序)。

经过以上几步,问题还是没能得到解决。B应该还有某个(些)关键点A不一样。但是这个(些)关键点究竟是什么?我们应该怎么找到它(们)?这时候该本文的主角process monitor闪亮登场啦!

请出process monitor

在开始前,先跟各位读者介绍下process monitor的事件分类:

process monitor捕获的事件总共分为 5 类:

  • Registry Activity 注册表相关事件(键和值的读写,创建,删除,枚举等)

  • File System Activity 文件系统相关事件(本地存储和远程文件系统相关事件)

  • Network Activity 网络相关事件(TCP和UDP网络活动)

  • Process and Thread Activity 进程及线程事件(进程和线程事件,模块加载)

  • Profiling Event(我没用过,具体可参考书上的介绍)

为了方便大家获得更详细的介绍,特意从《Troubleshooting with the Windows Sysinternals Tools》(英文版)中截了一张图:

class of events 截自《Troubleshooting with the Windows Sysinternals Tools》(英文版)

捕获Event data

首先,使用process monitor分别在AB上捕获Event Data。这里不贴出使用process monitor捕获的过程了。操作很简单,在之前的文章([原]为IDA加载调试符号)里有录像。

好了,拿到了Event Data我保存的Event Data下载地址在文末 [1]),接下来我们应该怎么对比呢?

对比分析Event Data

在对比前,我们应该过滤掉无关的事件(因为process monitor捕获到的事件实在是太多了),这里我只根据进程名进行了基本的过滤。

过滤完成后,我们从五类事件中的File System事件看起(没想到直接解决了问题,剩下几个不用看了????)。

对比图如下(左侧是A,右侧是B):

filesystem event compare

Wow, 从图中我们明显可以看出来,A成功加载了pgcell.ocxB没有加载。有windows COM组件开发经验的读者一定想到了,B上没注册pgcell.ocx

解决问题

知道问题的原因,剩下的事情就很好办了。在B上注册pgcell.ocx。注册成功后,在程序里重新执行对应的功能,一切正常。搞定收工。

为了方便对windows COM组件开发不熟悉的读者,这里给出注册脚本(#后面的是注释)。

cd path/to/pgcell.ocxregsvr32 pgcell.ocx# regsvr32 -u pgcell.ocx  # unregister pgcell.ocx

关于regsvr32的更多用法,可以直接运行regsvr32进行学习。在我机器上运行后的截图如下:

regsvr32 -u

通过regsvr32给出的提示,相信聪明的你也可以自己写一个COM组件的注册和卸载工具。如果对这方面有兴趣,欢迎留言交流。

后记

最开始帮同事解决这个问题的时候,没有用process monitor,而是使用了process explorer。在继续阅读下面的文章前,请先停下来好好思考一下,如何使用process explorer排查此问题?

和使用process monitor一样,我们需要对比程序在AB上有什么不同。话不多说,请看动态对比图:

A上的运行过程:

good

B上的运行过程:bad

我们可以发现,A上能成功加载pgcell.ocxB却没有加载。

能使用process explorer解决这个问题,多少有运气的成分!因为这个问题恰巧是由于加载不上某个dll导致的。如果是由于其它原因(e.g. 读取不到某个关键文件),使用process explorer就没那么容易发现问题所在了。

总结

  • 遇到问题,我们需要清晰的思路+合适的工具

  • 程序在一台电脑上运行正常,在另外一台上运行不正常。对比程序在两台电脑上的运行过程的不同点应该是解决这种问题的有效办法。

  • sysinternals系列工具,真的是排错神器!你值得拥有!

  • 一定要好好利用process monitor的过滤功能!能不能有效的过滤出我们想要的事件是重中之重!

参考资料

  • 《Windows Sysinternals实战指南》(中文版)

  • The Case of the Unexplained: Windows Troubleshooting[2]

References

[1] 点击下载我保存的Event Data:

https://bianchengnan.gitee.io/downloads/troubleshoot-malfunction-using-sysinternals-event-data.zip

[2] The Case of the Unexplained: Windows Troubleshooting:

https://channel9.msdn.com/events/ignite/2015/brk3316

猜你喜欢

[原]为IDA加载调试符号

[原]解决Tekla通过.tsep安装插件失败的问题

欢迎留言交流!

[原]排错实战——通过对比分析sysinternals事件修复程序功能异常相关推荐

  1. vba vbscript.regexp加载dll错误_[原]排错实战——拯救加载调试符号失败的IDA

    本文之前发表的时候有些问题,作为强迫症患者的我又重新编辑后再次发表.如果您已经看过,请忽略.望见谅. 缘起 最近想借助IDA逆向一个函数.在windows下,调试器(比如vs, windbg)可以通过 ...

  2. [原]排错实战——拯救加载调试符号失败的IDA

    本文之前发表的时候有些问题,作为强迫症患者的我又重新编辑后再次发表.如果您已经看过,请忽略.望见谅. 缘起 最近想借助IDA逆向一个函数.在windows下,调试器(比如vs, windbg)可以通过 ...

  3. 数仓工具—Hive实战之对比分析(15)

    对比分析 对比分析法是指将两个或两个以上的数据进行比较,分析它们的差异,从而揭示这些数据所代表的事物发展变化情况和规律性,当然最终的目的 .它可以非常直观地看出事物某方面的变化或差距,并且可以准确.量 ...

  4. [原]排错实战——使用process explorer替换任务管理器

    前言 一般,我们会使用任务管理器查看系统中有哪些进程在运行,强制杀掉某个进程.可是系统自带的任务管理器功能有限,process explorer是一个功能更强大的工具.它可以让我们查看更多更详细的信息 ...

  5. [原]排错实战——VS清空最近打开的工程记录

    原脚本how-toprocess monitorsysinternalsvsvisual studiovs2017vs2019注册表 缘起 vs有一个功能 -- 在起始页会显示最近打开的工程列表,方便 ...

  6. [原]排错实战——解决Tekla通过.tsep安装插件失败的问题

    原总结调试排错troubleshootteklaprocess monitorsysinternals 缘起 最近同事使用.tsep安装Tekla插件的时候,Tekla提示该插件已经存在了,需要卸载后 ...

  7. [原]调试实战——程序CPU占用率飙升,你知道如何快速定位吗?

    前言 如果我们自己的程序的CPU Usage(CPU占用率)飙升,并且居高不下,很有可能陷入了死循环.你知道怎么快速定位并解决吗?今天跟大家分享几种定位方法,希望对你有所帮助. 如何判断是否有死循环? ...

  8. 排错实战——解决c++编译错误:error C2059: illegal token on right side of '::'

    缘起 最近,项目里出现了一个奇怪的编译错误.乍看错误提示,真有丈二的和尚,摸不着头脑的感觉.解决之后,又是这么的合情合理.具体是什么样的问题呢?一起来看看吧. 说明: 实际项目中的错误隐藏的更深,完全 ...

  9. 数据分析方法论|利用对比分析有效地说明数据结果和结论

    点击上方蓝字关注我们 对比分析是数据分析中最常用的.最好用.最实用分析方法之一.没有对比就不能说明问题,这也是对比分析在数据分析领域经久不衰的原因之一.对比分析是将两个或两个以上具有可比性的数据进行比 ...

最新文章

  1. 台式电脑不拉网线上网_技巧知识:电脑不用网线也可以上网了,你知道吗?
  2. IIS作为ASP.NET Core2.1 反向代理服务器未说的秘密
  3. 基于Emgu CV+百度人脸识别,实现视频动态 人脸抓取与识别
  4. 关于创业:希望有人在N年前就告诉我的一些事儿
  5. 02.改善深层神经网络:超参数调试、正则化以及优化 W1.深度学习的实践层面(作业:初始化+正则化+梯度检验)
  6. django-配置模板的路径-0223
  7. 分布式对象存储 读书笔记(一) 开始
  8. spring awre的理解
  9. 信息安全收集注意事项
  10. 网站定时监控平台有哪些 7款好用的实时监控网站工具
  11. 金蝶K3系统BOM批量导入操作指南
  12. 制作一个简单的通讯录
  13. tdscdma的matlab仿真,基于MATLAB的TDSCDMA调制解调仿真
  14. 小学生可以学java编程吗_小学生学编程都要学习哪些内容 家长们知道吗
  15. Linux之系统管理命令
  16. org.apache.zookeeper.server.quorum.QuorumPeerConfig$ConfigException: Error processing
  17. C++程序设计课程同步项目——循环结构程序设计项目任务二
  18. 电容笔和触控笔有什么区别?ipad手写电容笔推荐品牌
  19. MTJ 1.0 WTK 2.5.2_01无法调试J2ME应用
  20. unittest.defaultTestLoader.discover实现在运行时运行用例

热门文章

  1. IUnknown接口QueryInterface函数介绍
  2. 如何在Windows 8.1中获取Windows 10样式的开始菜单
  3. 如何使自己的不和谐机器人
  4. 什么是“ rpcsvchost”,以及为什么它在Mac上运行?
  5. 如何在OS X中打开或关闭鼠标定位器
  6. 如何使用智能铃声避免在Android中令人尴尬的大声铃声
  7. 10 个有关 String 的面试问题
  8. ubuntu,kali linux和windows三系统流水账——写给自己
  9. IOS使用Auto Layout中的VFL适配
  10. PHP访问连接MYSQL数据库