0CCh Blog

一个查找指定栈回溯符号并执行命令的Windbg脚本

这是自己没事在家调试程序的一个小需求。

有时候比如IE这样的程序,线程实在是非常的多,我想操作某个特殊线程就比较麻烦,需要先找到线程然后再实行命令,为了偷懒就写了这个脚本。

$$ If a frame of a thread has the target symbol, we execute the command.
$$ Author: nighxie
$$ Blog: 0cch.net

.if (${/d:$arg1} & ${/d:$arg2} & ${/d:$arg3}) {
.for (r @$t0 = 0; @$t0 < 0n${$arg1}; r @$t0 = @$t0 + 1) {
r @$t1 = 0;
~[@$t0]s;
!for_each_frame .if($spat("${@#SymbolName}", "${$arg2}")) {r @$t1 = 1}
.if (@$t1 == 1) {
${$arg3};
}
}
}
.else {
.echo "Usage $$>a<${$arg0} thread_count pattern cmd";
.echo "e.g. $$>a<${$arg0} 5 ntdll* ~n";
}

就如同上面的例子指定线程数量,要匹配的符号,最后就是要执行的命令。
$$>a<${$arg0} 5 ntdll* n就表示在前5个线程里寻找栈回溯有关ntdll的线程,然后执行n命令挂起线程。