Unitname herausfinden

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
schoschy
Beiträge: 56
Registriert: Di 18. Okt 2022, 15:46

Unitname herausfinden

Beitrag von schoschy »

Hey,
ich habe gestern versucht mittels google herauszufinden, wie ich in fpc den Unitname ermitteln kann. Die Ergebnisse waren früher auch mal besser...
Die Bezeichnung einer Func/Proc ist klar:

Code: Alles auswählen

{$I %CURRENTROUTINE%}
Muss ich jetzt in einer Unit eine Variable einbauen, in welche ich den Unitnamen reinschreibe, oder gibt es hierfür auch eine "globalere" Möglichkeit?

ich habe in Lazarus meine function- und procedure-Autovervollständigung etwas überarbeitet und dachte mir, dass man hier noch den Unitnamen implementieren könnte
Bsp:

Code: Alles auswählen

procedure ProcName();
begin
  try
  |
  except
    on e: Exception do
    WriteLn('Exception in ', {$I %CURRENTROUTINE%}, ' with error: ', e.Message);
  end;
end; 
WriteLn ist hier nur zur Darstellung gewählt, ich logge etwas komplexer.
Ist etwas überflüssig für den normalgebrauch, aber gelöscht ist es schneller, als es jedes mal hinzuschreiben.
--
Wenn ich hier murks verzapfe und es dafür einen besseren Ansatz der Fehlererkennung gibt, sage ich natürlich nicht nein. :wink:

Grüße

CCRDudeLaz
Beiträge: 54
Registriert: Do 25. Jan 2024, 08:33
OS, Lazarus, FPC: Win/macOS (L trunk FPC trunk)
CPU-Target: 32+64

Re: Unitname herausfinden

Beitrag von CCRDudeLaz »

Solange es um eine Methode geht, wäre Self.UnitName eine Möglichkeit.

Solltest Du Debug-Infos haben (externe .dbg reichen), kannst Du GetLineInfo(get_pc_addr ....) verwenden. Solltest Du die Debug-Ausgabe in eine eigene Funktion auslagern, damit Änderungen besser ankommen, musst Du dann noch den Callstack durchgehen (get_caller_stackinfo), bzw. zumindest eins hoch...

Ich verwende das ungefähr so, um Informationen zur Funktion, aus der das aufgerufen wird, zu finden:

Code: Alles auswählen

procedure LocateCallingPosition(out AFunction, ASource: string; out ALine: longint; out AFrame: Pointer); overload;
var
   sFunction: shortstring = '';
   sSource: shortstring = '';
   sThisSource: shortstring = '';
   iLine: longint = 0;
   pCurrentFrame: Pointer;
   pCurrentAddress: CodePointer;
begin
   AFunction := '?';
   ASource := '?';
   ALine := -1;
   AFrame := nil;
   try
      // current address is inside this unit.
      pCurrentFrame := get_frame;
      pCurrentAddress := get_pc_addr;
      // get the parent, which is inside this unit...
      get_caller_stackinfo(pCurrentFrame, pCurrentAddress);
      if not Assigned(pCurrentAddress) then begin
         Exit;
      end;
      GetLineInfo(PtrUInt(pCurrentAddress), sFunction, sThisSource, iLine);
      // go up in hierarchy until first code line outside of this unit is found.
      repeat
         get_caller_stackinfo(pCurrentFrame, pCurrentAddress);
         if Assigned(pCurrentAddress) then begin
            GetLineInfo(PtrUInt(pCurrentAddress), sFunction, sSource, iLine);
         end else begin
            break;
         end;
         // At the end of functions, there's often a finally, which is a separate
         // function
         // sFunction @$0179FA29 = '$fin$0000002A'
         // @see https://forum.lazarus.freepascal.org/index.php/topic,63973.0.html
      until (sSource <> sThisSource) or (pCurrentFrame = nil) or (pCurrentAddress = nil);
      AFrame := pCurrentFrame;
      AFunction := sFunction;
      ASource := sSource;
      ALine := iLine;
   except
      on E: Exception do begin
         OutputDebugString('Failure parsing callstack');
      end;
   end;
end;  

Stevie
Beiträge: 173
Registriert: Di 27. Feb 2024, 22:40

Re: Unitname herausfinden

Beitrag von Stevie »

... hilft Dir vielleicht {$INCLUDE %FILE%}?
FILE
Filename in which the directive is found.
Das ist dann zwar nicht direkt der Name der Unit, aber wenn Du den Source unter Kontrolle hast, kommst Du ja vom Dateinamen direkt zum Unitnamen...

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6850
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Unitname herausfinden

Beitrag von af0815 »

Ich vwerwende generell gerne

Code: Alles auswählen

   on E : Exception do begin
      Debugln({$I %FILE%} + '->' +{$I %CURRENTROUTINE%} +'  Exception =>' + E.Message);
    end;
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

charlytango
Beiträge: 1088
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Unitname herausfinden

Beitrag von charlytango »

ich mache es ähnlich

Code: Alles auswählen

DebugLn(
'Unit: ' + UnitName + LineEnding +
'File: ' + {$I %FILE%} + LineEnding +
'Methodname: ' +  {$I %CURRENTROUTINE%} + LineEnding +
'Linenumber: ' + {$I %LINE%} + LineEnding +
'Exception: ' + E.Message + LineEnding +
'Message: ' + 'my Individual Message'
);

schoschy
Beiträge: 56
Registriert: Di 18. Okt 2022, 15:46

Re: Unitname herausfinden

Beitrag von schoschy »

Moin,

vier mal die Antwort das google am Arbeitsplatz ersetzt werden muss :lol:
Das Hilft mir weiter, danke euch!

Antworten