基于字符串参数的WinDBG条件断点

时间:2016-09-21 09:37:21

标签: c windbg

我想在第4个参数的值等于" abc"时设置条件断点。

void FunctionA(char* a, char* b, char* c, char* d)
{
`enter code here`//some code here
}

我使用以下命令,但它不起作用。你能帮忙吗?

bp app!FunctionA "as /mu ${/v:MyAlias} poi(d);.block{.if ($spat(\"${MyAlias}\", \"abc\") == 0)  { } .else { gc } }"

注意:app.exe是我的应用程序名称。

1 个答案:

答案 0 :(得分:1)

你不能在 char * 上使用 / mu / mu用于 null终止的unicode字符串而不是 ascii string ascii string use / ma

我假设您有描述性参数名称,而不是像 d 这样的参数 这显然会与 0xd又名0n13 发生冲突  是数字,字符串或符号??

poi(d)在你的情况下解决的是 poi(0x13),这显然是一个糟糕的拒绝 或本地符号错误地命名为d ??

中断时不会解释别名 使用别名时,您应该始终将它们填充到脚本文件中并执行 每次休息时的脚本文件

这是一个脚本文件的示例

window.tables.children(matching: .tableRow).element(boundBy: 0).children(matching: .cell).element(boundBy: 5).click()

这里是在调试模式下进行操作的代码,其中优化已关闭 在发布模式下,编译器将足够聪明,可以内联printf()调用

as /ma ${/v:MyAlias} poi(k)
.block {
    r $t0 = $spat("${MyAlias}" , "tiger")
    .printf "%x\t${MyAlias}\n" , @$t0 
    .if(@$t0 != 1) {gc}
}

用法

windbg app.exe

设置休息并运行
请记住,这个或任何使用别名的脚本都会失败 在 char * vampire 之前评估空条目 如果你想打破"吸血鬼" ,你可能需要即兴创作而不使用别名

#include <stdio.h>
#include <stdlib.h> //msvc _countof
void func(char* h,char* i,char* j,char* k ) {
    printf( "%s %s %s %s\n" ,h,i,j,k );
    return;
}
int main(void) {
    char* foo[] = {"goat","dog","sheep","cat","lion","tiger",0,"vampire"};
    for(int x=0;x<_countof(foo);x++) {
        func("this" , "is" , "a" , foo[x]);
    }
    return 0;    
}