在到达断点之前输入到调试器的数据

时间:2015-07-13 08:38:23

标签: c++ visual-studio-2013 windbg

我在目标计算机上运行了一个应用程序,并尝试使用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>

2 个答案:

答案 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)

:\&gt; ls -l <​​/ h3>
-rw-rw-rw-  1 Admin 0 128 2015-07-13 19:17 hitchange.cpp

:\&gt; cat hitchange.cpp

#include <stdio.h>
#include <stdlib.h>
void main (void) {
  for (int i =0; i< 10; i++){
    printf("%08x\n",rand());
  }
}

:\&GT; .. \的compile.bat

:\>cl /Zi /EHsc /nologo /W4 /analyze *.cpp /link /RELEASE
hitchange.cpp

:\&GT; hitchange.exe

00000029
00004823
000018be
00006784
00004ae1
00003d6c
00002cd6
000072ae
00006952
00005f90

:\&gt; cdb -c“bp hitchange!printf \”r $ t0 = poi(@ esp + 8);。printf \\\“实际兰特值 e @ [esp + 8] =%08x \\ n \\\“,@ $ t0; ed @ esp + 8 f001; gc; \”; g; 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