Register auslesen ist relativ einfach (ich skizzier das mal für Windows).
Du ruftst
GetThreadContext auf und bekommst in der contextvariable die entsprechenden Registerwerte.
Allerdings, wie schon zuvor erwähnt, sind das dann die Werte zu diesem Zeitpunkt - also wenn das derselbe Thread ist wie der gerade diesen Code ausführende, liegt die Wahrscheinlichkeit hoch dass das nicht mehr der Wert ist, der im Code vor der
Exception da drin stand - um das rekonstruieren müsste man rückwärts den Code disassembeln und das macht meines Wissens nach keins der Tools wie madExcept.
Beispiel: Ich hab den Code hier in nen ButtonClick geschrieben:
Delphi-Quellcode:
procedure ShowMsg(i: Integer);
begin
ShowMessage(i.ToString);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 1 to 10 do
begin
RaiseLastOSError;
ShowMsg(i);
end;
end;
Der assembler code unter
Win32 sieht so aus (mit
$O+W-
)
Code:
Unit1.pas.36: begin
0063A974 53 push ebx
Unit1.pas.37: for i := 1 to 10 do
0063A975 BB01000000 mov ebx,$00000001
Unit1.pas.39: RaiseLastOSError;
0063A97A E8F9CDE1FF call RaiseLastOSError
Unit1.pas.40: ShowMsg(i);
0063A97F 8BC3 mov eax,ebx
0063A981 E89EFFFFFF call ShowMsg
Unit1.pas.41: end;
0063A986 43 inc ebx
Unit1.pas.37: for i := 1 to 10 do
0063A987 83FB0B cmp ebx,$0b
0063A98A 75EE jnz $0063a97a
Unit1.pas.42: end;
0063A98C 5B pop ebx
0063A98D C3 ret
Wenn der call auf RaiseLastOSError passiert ist ebx also 1, aber im angezeigten madExcept bugreport Fenster steht dort bei mir im "cpu regs" Tab 00000000 drin, da bis dahin ebx wiederverwendet wurde