我已经运行在目标机器上的应用程序,并试图使用WinDbg的我的电脑进行调试。 现在我想输入一定的参考价值的WinDbg命中条件断点,并应尽快被击中传递作为参数传递给条件断点同前。
我的最终目的是,我不想的WinDbg等待输入超过一秒钟时命中断点。 大家都知道,WinDbg的冻结所有线程时断点命中,所以我得到很多定时器过去发行后继续(使用g
)。
我知道,我可以用一个文件(通过将所需数据)和断点被击中立即解析它。 但我希望用户断点命中之前,输入所需的数据(最多5个),并在该数据到应用程序的本地通时条件断点被击中。
我用下面的条件断点bp FileName.cpp:341 "j (1) '.echo \"Breakpoint hit, condition\";ed dwRand 12;gc'; 'gc'"
其实我想获得dwRand
断点命中前值,并在遇到断点更新条件断点为ed dwRand <VALUE>
。
WinDbg中不冻结自己的线程,它暂停他们,这是有区别的(见.hh freeze
详情)。 如果你所有的计时器都在其他线程,可以恢复所有的线程:
0:000> r $t0 = @$tid
0:000> ~*e .if (@$t0 != $tid) {~~[$tid]m} .else { .echo "current thread" }
current thread
0:000> ~
. 0 Id: 1624.f6c Suspend: 1 Teb: 7efdd000 Unfrozen
1 Id: 1624.180c Suspend: 0 Teb: 7efda000 Unfrozen
2 Id: 1624.864 Suspend: 0 Teb: 7efd7000 Unfrozen
3 Id: 1624.1d4c Suspend: 0 Teb: 7efaf000 Unfrozen
4 Id: 1624.14b0 Suspend: 0 Teb: 7efac000 Unfrozen
5 Id: 1624.1e54 Suspend: 0 Teb: 7efa9000 Unfrozen
6 Id: 1624.774 Suspend: 0 Teb: 7efa6000 Unfrozen
7 Id: 1624.1810 Suspend: 0 Teb: 7efa0000 Unfrozen
与此类似,只有当前线程( 0
)保持暂停( Suspend: 1
),直到你完成修改内存。 所有其它线程运行( Suspend: 0
)。
\> ls -l命令
-rw-rw-rw- 1 Admin 0 128 2015-07-13 19:17 hitchange.cpp
:\>猫hitchange.cpp
#include <stdio.h>
#include <stdlib.h>
void main (void) {
for (int i =0; i< 10; i++){
printf("%08x\n",rand());
}
}
:\> .. \的compile.bat
:\>cl /Zi /EHsc /nologo /W4 /analyze *.cpp /link /RELEASE
hitchange.cpp
:\> hitchange.exe
00000029
00004823
000018be
00006784
00004ae1
00003d6c
00002cd6
000072ae
00006952
00005f90
: “bp的hitchange printf的\” \> CDB -c R $ T0 = POI(@ ESP + 8);. printf的\\\“实际兰特VALUë@ [ESP + 8] =%08X \\Ñ\\\ ” @ $ T0; ED @ ESP + 8 F001; GC; \ “;克; q” hitchange.exe
0:000> cdb: Reading initial command 'bp hitchange!printf "r $t0 =poi(@esp+8);.pr
intf \"actual rand value @ [esp+8] = %08x\\n\",@$t0 ;ed @esp+8 f001;gc;";g;q'
actual rand value @ [esp+8] = 00000029
0000f001
actual rand value @ [esp+8] = 00004823
0000f001
actual rand value @ [esp+8] = 000018be
0000f001
actual rand value @ [esp+8] = 00006784
0000f001
actual rand value @ [esp+8] = 00004ae1
0000f001
actual rand value @ [esp+8] = 00003d6c
0000f001
actual rand value @ [esp+8] = 00002cd6
0000f001
actual rand value @ [esp+8] = 000072ae