为了跟踪console程序在访问某个文件时失败的问题,在内核中下了断点,但是内核中文件部分调用太频繁了,无法等到自己的文件。所以最好还是根据条件来下断点。
程序如下
想要在FileName是指定文件时停下来,例如FileName是c:\temp\file.txt的时候。
从代码可以看到FileName是个参数,但是可能是NULL,因此断点只能下到这一行:
memzero(&MyContext, sizeof(MyContext));
如果要比较需要知道FileName的值,但是FileName的值如何获取呢?
下断点在这里,断点到了之后,查看汇编
发现poi(rsp+50)里就是FileName的数据
于是编写script代码,文件名find2.sc:
bp fffff800`79c61082 "
r $t1=poi(rsp+50)
as /mu $FileName $t1
.block
{
.if($spat(\"${$FileName}\",\"*file.txt\"))
{
.echo 'find...';
ad ${/v:$FileName}
}
.else
{
ad ${/v:$FileName}
gc
}
}"
其中bp下的断点位置,是memzero(&MyContext, sizeof(MyContext));汇编所在的位置,直接在windbg命令行里直接输入如下命令运行,包括$$><等符号
$$><c:\temp\find2.sc
这样在访问file.txt的时候就停止下来了。
注意由于下脚本断点速度影响较大,文件访问很多,导致系统很慢,可以在console程序访问该文件前,使用 system("pause");暂停,然后再下断点。或者下了断点先禁用,等运行console程序停下来,再使能断点。
具体脚本解释,可以参考:如何写windbg高级脚本---以访问文件的windbg脚本为例说明 (pediy.com)