[erledigt] stderr in Console In/Output

Für Fragen rund um die Ide und zum Debugger
Antworten
pascoli
Beiträge: 16
Registriert: So 4. Mai 2025, 21:21

[erledigt] stderr in Console In/Output

Beitrag von pascoli »

Hallo,

in der Console des Debuggers kann man sich ja die Ausgaben von debugln(...) ansehen. Unter Linux, hier EndeavourOS, werden da aber auch die Ausgaben von stderr angezeigt, z.B.

Code: Alles auswählen

This plugin supports grabbing the mouse only for popup windows
kf.kio.filewidgets.kfilefiltercombo: KFileFilterCombo::setCurrentFilter: Could not find file filter KFileFilter(MIME patterns: QList() File patterns: QList() label:  
QThreadStorage: entry 13 destroyed before end of thread 0x2739aa0
QThreadStorage: entry 12 destroyed before end of thread 0x2739aa0
QThreadStorage: entry 11 destroyed before end of thread 0x2739aa0
Wenn man das in Lazarus erstellte Programm in einem Terminal mit "... 2>/dev/null" startet, sieht man nur die Ausgabe des Debuggers.

Kann man die Ausgabe von stderr in der Console irgendwie unterbinden?

PS: nach "label:" oben unter CODE folgt eigentlich noch ""). Aber das schaltet auf fett und andere Farbe. :o

Code: Alles auswählen

label: "")
Zuletzt geändert von pascoli am Fr 27. Mär 2026, 12:44, insgesamt 1-mal geändert.

Warf
Beiträge: 2286
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: stderr in Console In/Output

Beitrag von Warf »

Einfach das folgende zum LPR hinzufügen

Code: Alles auswählen

  FpClose(StdErrorHandle);
  Close(ErrOutput);  
Du brauchst außerdem BaseUnix in den Includes

pascoli
Beiträge: 16
Registriert: So 4. Mai 2025, 21:21

Re: stderr in Console In/Output

Beitrag von pascoli »

Dankeschön, das funktioniert soweit.

Allerdings kommt mit der Compileroption -gh bei Programmende ein RunError(101) und eine Exception EInOuError. Der Callstack dazu

Code: Alles auswählen

#0 FPC_BREAK_ERROR at :0
#1 SYSTEM_$$_HANDLEERRORADDRFRAMEIND$LONGINT$POINTER$POINTER+65 at :0
#2 fpc_iocheck+85 at :0
#3 HEAPTRC$_$HEAPTRACER_$__$$_REPORT$TEXT$BOOLEAN+763 at :0
#4 FINALIZE$_$HEAPTRC+244 at :0
#5 FPC_FINALIZEUNITS+65 at :0
#6 SYSTEM_$$_INTERNALEXIT+428 at :0
#7 fpc_do_exit+6 at :0
#8 main at motab.lpr:34
#9 SYSTEM_$$_SYSENTRY$TENTRYINFORMATION+12 at :0
Kann man den StdErr vor "end." in der lpr wieder "einschalten"?

Socke
Lazarusforum e. V.
Beiträge: 3186
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: stderr in Console In/Output

Beitrag von Socke »

Du kannst alternativ die Ausgabe von heaptrace in eine Datei umleiten: SetHeapTraceOutput
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

pascoli
Beiträge: 16
Registriert: So 4. Mai 2025, 21:21

Re: stderr in Console In/Output

Beitrag von pascoli »

Danke. Ich benutze jetzt am Anfang der lpr
SetHeapTraceOutput('heaptrace.log');
FpClose(StdErrorHandle);

Damit landen die Ausgaben von heaptrace in der Datei und die von stderr im Nirvana. Close(ErrOutput) scheint nicht erforderlich zu sein.

Warf
Beiträge: 2286
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: [erledigt] stderr in Console In/Output

Beitrag von Warf »

Das Close ist aus einem anderen Grund drin. Nativer Pascal Code handhabt Dateien über ein Betriebsystemunabhängiges State Management über den internen Text bzw. File Typen. Wenn du nur das Handle schließt wird dieser nicht geupdated und kann damit zu ungewollten Fehlern führen.

Als Beispiel:

Code: Alles auswählen

  if TextRec(StdErr).Mode<>fmClosed then // Testen ob StdError offen ist
     Write(StdErr, 'Foo'); // Wenn ja schreib was rein
Wenn ich jetzt nur das Handle schließe, dann knallt es hier mit einem "Disk write error":

Code: Alles auswählen

  FpClose(StdErrorHandle); // Handle schließen
  if TextRec(StdErr).Mode<>fmClosed then // Ist false weil der Textfile nicht geschlossen wurde
     Write(StdErr, 'Foo'); // Hier Knallts
Daher sollte immer noch zusätzlich die Pascal Funktion Close aufgerufen werden, damit der TextRec geupdated wird:

Code: Alles auswählen

  FpClose(StdErrorHandle); // Schließen des Handles sodass QT nicht mehr meckert
  Close(StdErr); // Update der Pascal Struktur
  if TextRec(StdErr).Mode<>fmClosed then // Wird als Closed angezeigt
     Write(StdErr, 'Foo'); // Wird nicht ausgeführt -> Knallt nicht

Antworten