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: TNotifyEvent $253B588 @OnChange: Pointer $253B588@FOnChange: Pointer $253B588@@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,这是两个地址!
您可以通过Debug Inspector获取地址.要获取字段的地址,请在更改发生之前的某个时刻在代码中放置断点,例如在调用构造函数之后.然后在Debug Inspector中打开您的对象.不确定如何使用旧的IDE样式,但在D2010中,您可以从Run-> Inspect ...菜单命令,Evaluate/Modify中的按钮,或通过键盘上的ALT-F5获取.(小心你不要打ALT-F4!)
Debug Inspector将向您显示包含其所有字段的对象.双击其中一个字段,它将在新的Debug Inspector窗口中打开.在顶部的编辑框状栏中将是您的字段的地址.您可以使用它来设置内存断点以查找值更改的位置.