AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi aktuelle Quellcodezeile im Programm ermitteln
Thema durchsuchen
Ansicht
Themen-Optionen

aktuelle Quellcodezeile im Programm ermitteln

Ein Thema von jus · begonnen am 28. Aug 2014 · letzter Beitrag vom 29. Aug 2014
Antwort Antwort
jus

Registriert seit: 22. Jan 2005
350 Beiträge
 
Delphi 2007 Professional
 
#1

AW: aktuelle Quellcodezeile im Programm ermitteln

  Alt 28. Aug 2014, 22:15
Die JCL (JEDI Component Library) kann das zum Beispiel.
@MaBuSE: Vielen vielen Dank für den Tipp!
Da ich sowieso JCL im Einsatz habe, habe mich entschieden doch JCL zu verwenden und bin somit davon abgegangen den "System.AssertErrorProc" zu manipulieren, da vermutlich andere Asserts/Exceptions von anderen Units damit auch abgefangen werden.

Nach einigen Experimenten funktioniert folgender Code für mein Vorhaben zufriedenstellend:
Delphi-Quellcode:
implementation

uses JclDebug;

procedure LogMsg(Msg:String);
var
  s: String;
begin
  s := Format('%s:%u (%s) "%s"',[FileByLevel(1), LineByLevel(1), ProcByLevel(1), Msg]);
  WriteToLogFile(s); // <----- ist nur exemplarisch gemeint ;-)
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  LogMsg('Fehlermeldung: Blablabla...');
end;
Achja, für Leute die eingehend sich mit den Möglichkeiten von JCL Debug beschäftigen möchten, weitere Beispiele findet man im JCL Installationsunterverzeichnis unter ".\examples\windows\debug". Der obige Code basiert in Prinzip auf JCL Beispiel ".\examples\windows\debug\sourceloc\SourceLocExamp le.dpr".

Lg,
jus

Geändert von jus (28. Aug 2014 um 22:23 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: aktuelle Quellcodezeile im Programm ermitteln

  Alt 28. Aug 2014, 22:37
Nach einigen Experimenten funktioniert folgender Code für mein Vorhaben zufriedenstellend
Wenn ich nur den Stack haben will mache ich folgendes:

Delphi-Quellcode:
...
// Form mit 1 x TButton + 1 x TMemo
implementation

uses
  jclDebug;

{$R *.dfm}

function GetStackList(
  IncludeModuleName: Boolean = False;
  IncludeAddressOffset: Boolean = False;
  IncludeStartProcLineOffset: Boolean = False;
  IncludeVAddress: Boolean = False): string;
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    with TJclStackInfoList.Create(True, 0, nil) do
    try
      Delete(0); // TJclStackInfoList
      Delete(0); // TJclStackInfoList
      Delete(0); // GetStackList
      AddToStrings(sl, IncludeModuleName, IncludeAddressOffset, IncludeStartProcLineOffset, IncludeVAddress);
    finally
      Free;
    end;
    Result := sl.Text;
  finally
    sl.Free;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Lines.Add(GetStackList);
end;

end.
Da kommt dann der Stack wie folgt raus:
Code:
[004DF643] Unit1.TForm1.Button1Click (Line 57, "Unit1.pas")
[00470E2B] Controls.TControl.Click (Line 7190, "Controls.pas")
[0049BD52] StdCtrls.TCustomButton.Click (Line 4562, "StdCtrls.pas")
[0049C840] StdCtrls.TCustomButton.CNCommand (Line 5023, "StdCtrls.pas")
[004708C0] Controls.TControl.WndProc (Line 7074, "Controls.pas")
[00475184] Controls.TWinControl.WndProc (Line 9831, "Controls.pas")
...
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: aktuelle Quellcodezeile im Programm ermitteln

  Alt 28. Aug 2014, 22:41
Wenn ich nur den Stack haben will mache ich folgendes
Oft macht es Sinn zu wissen von wem bzw. wo meine Funktion aufgerufen wurde.

[edit]dummerweise Zitat statt Bearbeiten gedrückt. sorry[/edit]
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.549 Beiträge
 
Delphi 12 Athens
 
#4

AW: aktuelle Quellcodezeile im Programm ermitteln

  Alt 29. Aug 2014, 16:53
Wenn ich nur den Stack haben will mache ich folgendes
Oft macht es Sinn zu wissen von wem bzw. wo meine Funktion aufgerufen wurde.
Für den Anfang versteckt sich in der System.pas eine kleine Funktion, um an die Aufruferadresse rauszubekommen.
Delphi-Referenz durchsuchenReturnAddress (OK, das ist die Rücksprungadresse, also die Adresse hinter dem Assembler-Call)

Das wird von einigen Exceptions verwendet, wie z.B. Delphi-Referenz durchsuchenAbort, Hier im Forum suchenError, Abstract-Error und dem SoftCast (AS).

Man bekommt zwar keine genaue Codezeile, aber wenn man den zugehörigen Quellcode noch hat, könnte man diese Adresse dennoch zuordnen, solange man die Startadresse des Moduls (EXE/DLL/BPL) kennt.
Und man muß ein bissl beachten. (so entspricht die Adresse nicht immer, wenn z.B. kein Stackframe vorhanden ist)
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (29. Aug 2014 um 16:55 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz