Delphi:如何获取事件变量的地址?

Ian*_*oyd 3 delphi debugging delphi-5 disassembly

如何获取持有事件处理程序的变量的地址?

例如

TExample = class(TObject)
private
    FOnChange: TNotifyEvent;
end;
Run Code Online (Sandbox Code Playgroud)

我想要的地址的的FOnChange私有成员,事件处理函数,变量.


为什么?

我试图找出谁FOnChange用垃圾覆盖我的处理程序变量.

我正在逐步完成代码:

if Assigned(FOnChange) then
    FOnChange(Self);
Run Code Online (Sandbox Code Playgroud)

任何事件处理程序曾经分配,以及一段时间FOnChange变量是nil在观察窗口:

@FOnChange: nil
Addr(FOnChange): nil
Run Code Online (Sandbox Code Playgroud)

但后来这个FOnChange变量变成了垃圾:

@FOnChange: $2C
Addr(FOnChange): $2C
Run Code Online (Sandbox Code Playgroud)

所以我想FOnChange在CPU窗口的数据窗格中观察变量,以便我可以从以下位置观看:

00410018 00000000
Run Code Online (Sandbox Code Playgroud)

00410018 0000002C
Run Code Online (Sandbox Code Playgroud)

除了我不知道的地址FOnChange; 我刚刚编造了$410018.

如何找到事件变量的地址


我试过的事情

观察名单

OnChange: nil
@OnChange: nil
@@OnChange: Variable required
@FOnChange: nil
Assigned(OnChange): False
Assigned(FOnChange): False
@@FOnChange: $253B588
addr(addr(FOnChange)): $253B588
Run Code Online (Sandbox Code Playgroud)

Alt + F5

  • 的OnChange: OnChange: TNotifyEvent $253B588
  • FOnChange:检查'FOnChange'时出错:表达式错误
  • Self.FOnChange:检查'Self.FOnChange'时出错:表达式错误
  • @OnChange:@OnChange: Pointer $253B588
  • @@ OnChange:检查'@@ OnChange'时出错:表达式错误
  • @FOnChange:@FOnChange: Pointer $253B588
  • @@ FOnChange:@@FOnChange: ^Untyped (no address) 数据: @@ FOnChange $ 253B588`

这一共识似乎已得到解决0x253B588.

然而,当我运行一些示例代码时:

MyControl1.OnChange := TheOnChangeHandler;
Run Code Online (Sandbox Code Playgroud)

这变成了:

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
Run Code Online (Sandbox Code Playgroud)

难怪我找不到一个地址FOnChange,这是两个地址!

Mas*_*ler 6

您可以通过Debug Inspector获取地址.要获取字段的地址,请在更改发生之前的某个时刻在代码中放置断点,例如在调用构造函数之后.然后在Debug Inspector中打开您的对象.不确定如何使用旧的IDE样式,但在D2010中,您可以从Run-> Inspect ...菜单命令,Evaluate/Modify中的按钮,或通过键盘上的ALT-F5获取.(小心你不要打ALT-F4!)

Debug Inspector将向您显示包含其所有字段的对象.双击其中一个字段,它将在新的Debug Inspector窗口中打开.在顶部的编辑框状栏中将是您的字段的地址.您可以使用它来设置内存断点以查找值更改的位置.