缘起

最近,我们程序的某个功能在一台机器上不正常,但是在另外一台机器上却是正常的。代码是同一份,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. java日志统计_Java实现蓝桥杯日志统计
  2. sql 中CURSOR 的使用
  3. 得到Js文件的绝对路径或相对路径的两法
  4. 使用AutoMake轻松生成Makefile
  5. P2657-[SCOI2009]windy数【数位dp,dfs】
  6. .net性能测试和优化1 基本概念
  7. libevent book——event | Gaccob的博客
  8. [2017-08-25]100行CSharp代码利用dynamic写个DSL(特定领域语言)
  9. php curl使用
  10. 物联网工程课程设计论文
  11. USB蓝牙适配器修改软件升级 玩转蓝牙配置虚拟BLE基站 修改MAC 和 RAWDATA数据
  12. 三星显示屏测试软件,MagicTune(三星显示器调节工具)
  13. linux 删除网桥接口,linux 网桥代码分析 三 网桥及网桥端口的添加与删除
  14. unity3D导入fbx模型,并实现fbx模型的自由旋转源码详解
  15. 服务器如何挂网页游戏,网页游戏怎么挂云服务器
  16. iPhone 8 和 8 Plus 发布!双面全玻璃设计,配置提升
  17. 春节钱包大流量奖励系统入账及展示的设计与实现
  18. ISIS-P2P网络的LSDB更新
  19. 聚合支付码是什么意思及它产生的背景
  20. 软件测试学习(基础篇)— —第5天:JS基础

热门文章

  1. 特定视图呈现时发生的事件顺序
  2. 关于Tomcat5.5中EL表达式无效的解决办法
  3. 使用ama0实现串口通信_“ AMA”是什么意思,以及如何使用它?
  4. jQuery杂项进阶(四)
  5. Qtum 量子链跨链原子激活 实现 QTUM-BTC 交换
  6. Object关于属性property的静态方法
  7. 在Esxi 5.1虚机中安装OEM服务器系统
  8. com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input
  9. 08_drain a node on the swarm
  10. HTML accesskey 属性