windbg
断开调试对象,因为它打开了一个已知文件。由于$scmp
不接受直接地址,因此我必须使用as
(windbg
别名命令)。因此,我在CreateFileA
处放置了一个条件断点:bu Kernel32!CreateFileA "as /ma ${/v:fName} poi(esp+4);.echo ${fName};...;g"
它总是打印相同的(第一个)文件名。我还尝试了脚本文件
bu ... "$>< bpCmd"
bu ... "$$>< bpCmd"
bpCmd
内容:as /ma ${/v:fName} poi(esp+4);
.echo ${fName};
...
g;
它也不起作用。
那么,为什么
as
在日志断点上不起作用?#1 楼
The alias needs to be evaluated
每次碰到断点否则,它将仅打印旧别名
强制别名评估`将.echo和其他命令包含在.block {}内
crefil:\>dir /b
CreateFile.cpp
crefil:\>type CreateFile.cpp
#include <stdio.h>
#include <windows.h>
int main (void)
{
PWIN32_FIND_DATA lpFindFileData =
(PWIN32_FIND_DATA) calloc(1 , sizeof( WIN32_FIND_DATA));
FILE *fp;
errno_t err;
if (lpFindFileData)
{
HANDLE hFind = FindFirstFile("*.*",lpFindFileData);
if ( hFind != INVALID_HANDLE_VALUE )
{
do
{
printf("%s\n",lpFindFileData->cFileName);
if ( (err = fopen_s(&fp,lpFindFileData->cFileName,"rb") ) == 0 )
if (fp)
fclose(fp);
}while( ( FindNextFile(hFind,lpFindFileData) ) != FALSE );
FindClose(hFind);
free(lpFindFileData);
}
}
return 0;
}
在windbg条件断点中
crefil:> cdb -c“ bp kernel32!CreateFileA \”为/ ma $ {/ v:fname} poi(@ esp + 4 );. block
{.echo fname}; gc \“; g; q” CreateFile.exe
0:000> cdb: Reading initial command 'bp kernel32!CreateFileA "as /ma ${/v:fname}
poi(@esp+4);.block { .echo fname };gc";g;q'
.
..
CreateFile.cpp
CreateFile.exe
CreateFile.obj
CreateFile.pdb
vc100.pdb
quit: