我在目标计算机上运行了一个应用程序,并尝试使用WinDbg从我的PC上调试它。现在我想在命中断点之前向WinDbg输入一些值,并且一旦被击中,它就会作为参数传递给条件断点。
我的最终目标是,当断点被击中时,我不希望WinDbg等待输入超过一秒钟。众所周知,当断点被击中时,WinDbg会冻结所有线程,因此我在继续之后(使用g
)得到批次计时器过去问题。
我知道我可以使用一个文件(通过输入所需的数据)并在命中断点时立即解析它。但是我希望用户在断点点击之前输入所需的数据(最多5个),并在达到条件断点时将该数据传递给应用程序本地。
我使用以下条件断点bp FileName.cpp:341 "j (1) '.echo \"Breakpoint hit, condition\";ed dwRand 12;gc'; 'gc'"
实际上我希望在断点点击之前获得dwRand
值,并在断点点击时将条件断点更新为ed dwRand <VALUE>
。
答案 0 :(得分:0)
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
)。
答案 1 :(得分:0)
-rw-rw-rw- 1 Admin 0 128 2015-07-13 19:17 hitchange.cpp
#include <stdio.h>
#include <stdlib.h>
void main (void) {
for (int i =0; i< 10; i++){
printf("%08x\n",rand());
}
}
:\>cl /Zi /EHsc /nologo /W4 /analyze *.cpp /link /RELEASE
hitchange.cpp
00000029
00004823
000018be
00006784
00004ae1
00003d6c
00002cd6
000072ae
00006952
00005f90
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