我想基于一个参数的成员设置条件断点, 现在我可以使用命令dt来检查这个参数, 我的代码如下所示:
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的值在这个方法上设置一个条件断点,任何人都可以告诉我该怎么做?非常感谢!
如果有人能提供一些关于如何使用偏移量的信息(例如m的+ 0x004),我们表示赞赏,谢谢!
答案 0 :(得分:4)
在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());
}
}
在windbg中将set_val()上的条件断点设置为当width == 7时
条件断点语法说明
classtest!MyClass::set_val
<module!class::method>
@@c++()
c++ expression evaluator
使用@ecx
this pointer
保持MyClass *
适当的类型为width
member of MyClass
是6
我们在本演示中使用break point prior to execution of set_val()
进行比较
因为我们正在设置uninitialized garbage
方法
(打印first time
时注意gc
显示MyClass if width != 7
后,.else is implied
从条件开始
width == 7
bp classtest!MyClass::set_val
".if( @@c++((((MyClass *) @ecx )->width)) != 6 ) {dt MyClass @ecx ; gc }"
打破
命令应该在一行
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
结果
{{1}}
答案 1 :(得分:0)
你可以对windbg使用pykd扩展名(pykd.codeplex.com。用它创建条件断点很容易。
0.2.0.29(推荐版本)
KD&GT;!pycmd
dbgee = module(“dbgee”)
bp = setBp(dbgee.test,lambda bpId:getParams()[0] .m == 2130567168)
退出()
kd&gt; g
0.3.0.10(开发者版)
您可以将代码放在文件中并使用以下命令运行它: !py --global bp.py
0.2.x版本也可以运行脚本,但它在隔离的环境中运行,退出后所有对象(包括断点)都将被销毁。所以0.3.x版本有可能在“全局”环境中运行脚本(所有全局对象都存活直到加载pykd)