Einzelnen Beitrag anzeigen

Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#9

AW: Exception - Register + DataStack

  Alt 23. Mai 2022, 15:21
Register auslesen ist relativ einfach (ich skizzier das mal für Windows).
Du ruftst MSDN-Library durchsuchenGetThreadContext 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
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat