> 文章列表 > 使用Process Monitor探测日志文件是C++程序哪个模块生成的

使用Process Monitor探测日志文件是C++程序哪个模块生成的

使用Process Monitor探测日志文件是C++程序哪个模块生成的

目录

1、问题描述

2、使用Process Monitor监测目标文件是哪个模块生成的思路说明

3、操作Process Monitor监测日志文件是哪个模块生成的

4、通过screenctach.dll库的时间戳,找到其pdb文件,然后去查看详细的函数调用堆栈

5、最后


VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N3I4https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)icon-default.png?t=N3I4https://blog.csdn.net/chenlycly/article/details/125529931C++软件分析工具案例集锦(正在更新中...)icon-default.png?t=N3I4https://blog.csdn.net/chenlycly/category_12279968.html?spm=1001.2014.3001.5482       使用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工具高效地定位日志文件出处,快速地解决软件中的一些问题。