目录
1、问题描述
2、使用Process Monitor监测目标文件是哪个模块生成的思路说明
3、操作Process Monitor监测日志文件是哪个模块生成的
4、通过screenctach.dll库的时间戳,找到其pdb文件,然后去查看详细的函数调用堆栈
5、最后
VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具从入门到精通案例集锦(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/article/details/131405795C/C++基础与进阶(专栏文章,持续更新中...)https://blog.csdn.net/chenlycly/category_11931267.html 使用Process Monitor工具可以监测目标程序在运行过程中文件活动,比如创建、读写了哪些文件,可以使用这个监测功能去搞清楚日志文件是哪些模块生成的。今天通过一个实例详细讲述一下使用Process Monitor监测程序文件活动的完整过程。
1、问题描述
比如在测试软件时,发现软件在运行的过程中会产生一些临时的日志文件,比如有次我们遇到软件会在桌面上产生一个日志文件,明显这是不能容忍的,日志要统一管理,不必要的日志文件都要统统清理掉。
但我们不知道这些日志文件是哪些模块产生的,询问了底层模块的开发维护组,也没人认领,没法搞清楚这个日志是那个模块产生的,也就无从清理了。后来我们向测试同事推荐Process Monitor工具,通过该工具监测我们软件的文件活动,看看这个文件到底是哪个模块生成的,最后确实找出来了。
下面列举一个监测文件的实例,以供大家参考。比如我们要监测TestScreenCatch.exe程序中是哪个模块生成了screencatch.log文件:(此处只是范例,此处通过文件名称就能猜出是哪个模块生成的)
2、使用Process Monitor监测目标文件是哪个模块生成的思路说明
可以先将程序关闭,然后将日志文件screencatch.log删除掉,然后使用Process Monitor监控该程序,监控该文件是什么创建出来的。然后Process Monitor监测到了对该文件的操作活动,然后以screencatch.log名称在活动记录中搜索,然后找出调用CreateFile创建文件的记录,然后双击该记录,查看相关的函数调用堆栈。同过函数调用堆栈,就能确定是程序的哪个模块生成的,甚至还能看到是哪个函数创建了该文件。
3、操作Process Monitor监测日志文件是哪个模块生成的
先启动Process Monitor工具,将要监测的进程设置为TestScrrenCatch.exe:
开启监测。
重新运行TestScrrenCatch.exe程序,有代码向screencatch.log文件中写日志,然后停止Process Monitor的监测。然后按下Ctrl+F快捷键,调出搜索窗口,输入screencatch.log关键字进行搜索,找到操作screencatch.log文件的记录,双击记录,打开记录的详情页面:
切换到stack标签页,查看当前操作所在线程的函数调用堆栈:
最上面系统库的接口,调用堆栈向下拉动一下,找到调用fopen或者WriteFile接口,再向下就看到具体业务模块的接口了:
发现是screenctach.dll库的相关接口中向screencatch.log文件写入内容的。但因为缺乏pdb文件,无法看到具体的接口。
4、通过screenctach.dll库的时间戳,找到其pdb文件,然后去查看详细的函数调用堆栈
上面我们知道是screenctach.dll库生成了screencatch.log文件,但因为缺乏pdb文件,函数调用堆栈中看不到具体的函数接口。为了函数调用堆栈中能显示函数接口、所在cpp文件名称及代码行号,我们需要取来screencatch.dll库的pdb符号库文件,Process Monitor加载pdb文件后就能显示这些详细的信息了。
我们先使用PEViewer工具查看screenctach.dll库的时间戳(生成screenctach.dll库的时间):
然后按照该时间戳到版本服务器上找到screenctach.dll库对应的pdb文件,然后将pdb文件放到screenctach.dll库的同级目录中,再次双击刚才查看的那条记录,Process Monitor会自动从当前目录中去搜索pdb文件,然后自动去加载。因为有了screenctach.dll库的pdb符号,函数调用堆栈中就显示了具体的接口和行号了,如下所示:
这样我们就知道是哪个模块哪句代码操作screencatch.log文件了,就找到生成screencatch.log文件的源头了。
5、最后
对于即将要发布的正式软件,是不能随意地在某些目录中生成日志文件的,仅需要保留一些关键信息的打印日志。对于包含上百个dll模块的大型软件,可以使用Process Monitor工具高效地定位日志文件出处,快速地解决软件中的一些问题。