如何获取持有事件处理程序的变量的地址? 例如 TExample = class(TObject)private FOnChange: TNotifyEvent;end; 我想要FOnChange私有成员,事件处理程序,变量的地址. 为什么? 我试图找出谁用垃圾覆盖我
例如
TExample = class(TObject) private FOnChange: TNotifyEvent; end;
我想要FOnChange私有成员,事件处理程序,变量的地址.
为什么?
我试图找出谁用垃圾覆盖我的FOnChange处理程序变量.
我正在逐步完成代码:
if Assigned(FOnChange) then FOnChange(Self);
没有分配任何事件处理程序,并且有一段时间,监视窗口中的FOnChange变量为nil:
@FOnChange: nil Addr(FOnChange): nil
但后来FOnChange变量变成了垃圾:
@FOnChange: $2C Addr(FOnChange): $2C
所以我想在CPU窗口的数据窗格中观察FOnChange变量,以便我可以从以下位置观察:
00410018 00000000
至
00410018 0000002C
除了我不知道FOnChange的地址;我刚买了410018美元.
如何找到事件变量的地址?
我试过的事情
观察名单
OnChange: nil @OnChange: nil @@OnChange: Variable required @FOnChange: nil Assigned(OnChange): False Assigned(FOnChange): False @@FOnChange: $253B588 addr(addr(FOnChange)): $253B588
Alt F5
> OnChange:OnChange:TNotifyEvent $253B588
> FOnChange:检查’FOnChange’时出错:表达式错误
> Self.FOnChange:检查’Self.FOnChange’时出错:表达式错误
> @OnChange:@OnChange:指针$253B588
> @@ OnChange:检查’@@ OnChange’时出错:表达式错误
> @FOnChange:@FOnChange:指针$253B588
> @@ FOnChange:@@ FOnChange:^无类型(无地址)数据:@@ FOnChange $253B588`
共识似乎在地址0x253B588.
然而,当我运行一些示例代码时:
MyControl1.OnChange := TheOnChangeHandler;
这变成了:
mov edx,[ebp+$08] ;move stack variable $08 into edx mov [eax+$00000208],edx ;and then into offset $208 of my control mov edx,[ebp+$0c] ;move stack variable $0c into edx mov [eax+$0000020c],edx ;and then into offset $20c of my control
难怪我找不到FOnChange的地址,这是两个地址!
您可以通过Debug Inspector获取地址.要获取字段的地址,请在更改发生之前的某个时刻在代码中放置断点,例如在调用构造函数之后.然后在Debug Inspector中打开您的对象.不确定如何使用旧的IDE样式,但在D2010中,您可以从Run-> Inspect …菜单命令,Evaluate / Modify中的按钮,或通过键盘上的ALT-F5获取. (小心你不要打ALT-F4!)Debug Inspector将向您显示包含其所有字段的对象.双击其中一个字段,它将在新的Debug Inspector窗口中打开.在顶部的编辑框状栏中将是您的字段的地址.您可以使用它来设置内存断点以查找值更改的位置.