如何使用windbg根据参数值设置条件断点
我想基于一个参数的成员设置一个条件断点, 现在我可以使用命令dt来检查这个参数, 我的代码如下所示:如何使用windbg根据参数值设置条件断点,windbg,conditional-breakpoint,Windbg,Conditional Breakpoint,我想基于一个参数的成员设置一个条件断点, 现在我可以使用命令dt来检查这个参数, 我的代码如下所示: void test(const MyClassB &inst, int value) { } 现在我可以使用dt命令查看第一个参数,结果是: 0:000:x86> dt MyClassB @esp+4 dbgee!MyClassB +0x000 id : (null) +0x004 m : 0n2130567
void test(const MyClassB &inst, int value)
{
}
现在我可以使用dt命令查看第一个参数,结果是:
0:000:x86> dt MyClassB @esp+4
dbgee!MyClassB
+0x000 id : (null)
+0x004 m : 0n2130567168
+0x008 myClassA : MyClassA
现在我想根据inst.m的值在这个方法上设置一个条件断点,有人能告诉我怎么做吗?非常感谢
如果有人能提供一些关于如何使用偏移量的信息(例如+0x004表示m),我们将不胜感激,谢谢 您可以使用windbg的pykd扩展名。使用它创建条件断点很容易
dbgee=模块(“dbgee”)
bp=setBp(dbgee.test,lambda bpId:getParams()[0].m==2130567168)
退出()
kd>g
0.2.x版本也可以运行脚本,但它在隔离环境中运行,退出后所有对象(包括断点)都将被销毁。因此0.3.x版本可以在“全局”环境中运行脚本(在加载pykd之前,所有全局对象都处于活动状态)在msvc++2010exp中使用
cl/Zi/nologo/W4/analyze%1%/link/RELEASE编译的代码片段
#include <stdio.h>
class MyClass {
int width,length;
public:
void set_val(int,int);
int area();
};
void MyClass::set_val(int x , int y) {
width = x;
length = y;
}
int MyClass::area() {
return width*length;
}
void main(void) {
MyClass foo;
for (int i = 0; i < 10; i++) {
foo.set_val(i,5);
printf("%d\n",foo.area());
}
}
结果
0:000> bp classtest!MyClass::set_val ".if( @@c++((((MyClass *) @ecx )->width)) != 6 ) {dt MyClass @ecx ; gc }"
0:000> bl
0 e 00401000 0001 (0001) 0:**** classtest!MyClass::set_val ".if( @@c++((((MyClass *) @ecx )->width)) != 6 ) {dt MyClass @ecx ; gc }"
0:000> g
ModLoad: 5cb70000 5cb96000 C:\WINDOWS\system32\ShimEng.dll
classtest!MyClass
+0x000 width : 0n4205541
+0x004 length : 0n4208683
classtest!MyClass
+0x000 width : 0n0
+0x004 length : 0n5
classtest!MyClass
+0x000 width : 0n1
+0x004 length : 0n5
classtest!MyClass
+0x000 width : 0n2
+0x004 length : 0n5
classtest!MyClass
+0x000 width : 0n3
+0x004 length : 0n5
classtest!MyClass
+0x000 width : 0n4
+0x004 length : 0n5
classtest!MyClass
+0x000 width : 0n5
+0x004 length : 0n5
eax=00000007 ebx=7ffdf000 ecx=0013ff70 edx=00416680 esi=00000000 edi=0098f6ee
eip=00401000 esp=0013ff60 ebp=0013ff78 iopl=0 nv up ei ng nz ac po cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000293
classtest!MyClass::set_val:
00401000 55 push ebp
0:000> dd esp l3
0013ff60 0040106c 00000007 00000005
0:000> x @eip
0:000> ?? @eip
unsigned int 0x401000
0:000> lsa . 0,1
> 8: void MyClass::set_val(int x , int y) {
0:000> dv
this = 0xfffffffe
x = 0n7
y = 0n5
谢谢!顺便问一下,你知道用偏移量来查看d命令的值吗?比如dd(somfunc(@esp+4)+offset)等等,我不知道…顺便说一句,你能解释一下0x000,0x004的值是什么,以及如何使用它们吗?提前感谢!classtest!MyClass+0x000宽度:0n0+0x004长度:0n5
这些是对成员的偏移宽度在32位机器中定义为int=32位,所以4字节是宽度星的大小0x0长度处的ts在+4处跟随它,以此类推,假设你在0x403000处找到一个结构,403000将保持宽度,403004将保持长度,以此类推谢谢!我们可以根据寄存器使用这些偏移量吗,以你的代码为例,ecx
?可能是一些类似于dd whatfunc(@ecx)+offset
?
0:000> bp classtest!MyClass::set_val ".if( @@c++((((MyClass *) @ecx )->width)) != 6 ) {dt MyClass @ecx ; gc }"
0:000> bl
0 e 00401000 0001 (0001) 0:**** classtest!MyClass::set_val ".if( @@c++((((MyClass *) @ecx )->width)) != 6 ) {dt MyClass @ecx ; gc }"
0:000> g
ModLoad: 5cb70000 5cb96000 C:\WINDOWS\system32\ShimEng.dll
classtest!MyClass
+0x000 width : 0n4205541
+0x004 length : 0n4208683
classtest!MyClass
+0x000 width : 0n0
+0x004 length : 0n5
classtest!MyClass
+0x000 width : 0n1
+0x004 length : 0n5
classtest!MyClass
+0x000 width : 0n2
+0x004 length : 0n5
classtest!MyClass
+0x000 width : 0n3
+0x004 length : 0n5
classtest!MyClass
+0x000 width : 0n4
+0x004 length : 0n5
classtest!MyClass
+0x000 width : 0n5
+0x004 length : 0n5
eax=00000007 ebx=7ffdf000 ecx=0013ff70 edx=00416680 esi=00000000 edi=0098f6ee
eip=00401000 esp=0013ff60 ebp=0013ff78 iopl=0 nv up ei ng nz ac po cy
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000293
classtest!MyClass::set_val:
00401000 55 push ebp
0:000> dd esp l3
0013ff60 0040106c 00000007 00000005
0:000> x @eip
0:000> ?? @eip
unsigned int 0x401000
0:000> lsa . 0,1
> 8: void MyClass::set_val(int x , int y) {
0:000> dv
this = 0xfffffffe
x = 0n7
y = 0n5