Linux: wie debuggt man einen daemon!?

Antworten
Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Linux: wie debuggt man einen daemon!?

Beitrag von Nimral »

Jungs, ich brauch mal wieder einen, zwei Tipps. Vorab: Debian 10.8, Lazarus 2.2.0, FPC 3.2.2.

Ich habe einen recht umfangreichen Dienst programmiert. Klein begonnen, hat ganz gut funktioniert, dann immer mehr eingebaut, jetzt macht er plötzlich Zicken. Leider ist nicht herauszubekommen war er so treibt. Wenn ich ihn interaktiv ausführe (-run),läuft er tadellos. Im Hintergrund (ausgeführt unter dem selben User, oder auch als root - das ändert gar nichts) ist er stumm wie ein Fisch. Er schreibt nicht auf die Konsole (writeln, debugln), er schreibt auch nicht in eine Datei, weder mit den üblichen Dateikommandos, noch mit set Lazarus_debuglog= und DebugLn. Parallel habe ich natürlich versucht, es ihm erst mal einfach zu machen, und ihm als Verzeichnis für Ausgaben ein extra Unterverzeichnis /var/log/test angelegt, mit chmod 777 /var/log/test, auch kontrolliert mir ls -l, passt, aber da erscheint trotzdem keine Datei.

Ich kann den Debugger anhängen, aber der landet irgendwo in einem Haufen nutzloser Adressen, auch der Call-Stack listet keine einzige bekannte Routine auf, obwohl ich natürlich mit Debug gebaut habe, und interaktiv von Lazarus aus tadellos debuggen kann. Ich habe in so ziemlich jeder Schleife, wo der Code eigentlich vorbei kommen müsste, Breakpoints gesetzt, interaktiv hält er an, nach "Attach to Process" triggert kein Einziger davon.

Vielleicht ist zu diesem Zeitpunkt ja schon so ziemlich alles abgestürzt? EIn paar Mal konnte ich sowas beobachten, der Daemon ging dann auf stop, und danach hat systemctl status mir immerhin einen Stacktrace und einen Fehlercode ausgeworfen. Jetzt steht da garnichts.

Und jetzt suche ich irgendeinen Ansatzpunkt, wie ich irgendwie Ausgaben irgendwo hin zaubern kann um zu sehen, wie weit der Code denn überhaupt kommt. Was habe ich überhaupt an Bewaffnung zur Verfügung? Geht etwa irgendwie das Schreiben auf die Konsole, immerhin führe ich den Daemon (nachkontrolliert mir ps) ja unter meinem User-Account aus, trotzdem schreibt er wohl nicht auf meine Konsole.

Schön wäre natürlich, ich könnte möglichst früh den Debugger "attachen". Unter Windows hat mir einer von euch die geniale Zeile

Code: Alles auswählen

While not IsDebuggerPresent do sleep(100);
verraten, die funktioniert auch super. Ohne bin ich regelmäßig zu langsam um den Debugger anzuhängen bevor es knallt. Unter Linux fand ich erst einmal nichts vergleichbares.

Wer hat Ideen???

Thnx, Armin.

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1435
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Linux: wie debuggt man einen daemon!?

Beitrag von fliegermichl »

Mit dem gdb kann man meine ich mit dem Parameter -p <ProcessId> sich an einen laufenden Prozess hängen.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Linux: wie debuggt man einen daemon!?

Beitrag von theo »

Aus dem Bauch heraus: Könnte es sein, dass dein Daemon irgendwo auf X11 zugreifen will und kein Display bekommt?
Benutzt du Grafik (Bitmap etc.) in dem Daemon?

Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Re: Linux: wie debuggt man einen daemon!?

Beitrag von Nimral »

Danke euch erst mal.

Das Anhängen an den laufenden Prozess ist nicht das Problem, das klappt ja wunderbar. Das Problem ist dass ich das erst tun kann wenn er vermutlich bereits hängt, ich benötige ja seine PID und muss daher abwarten bis er läuft. Deswegen ist ja das Windows Dings so genial: ich baue es in irgendeinen frühen Konstruktor oder in die LPR ein und kann den Code fast unmittelbar einfangen sobald er vom Service Control Manager gestartet wird.

Grafik kann man m.E. ausschließen. Das Projekt wurde mit Lazarus als als Daemon gebaut, die LCL ist auch nicht eingebunden. Ich checke trotzdem nochmal, ob ich mir nicht irgendwo eine grafische Bibliothek eingefangen habe, ich meine aber dass dann - da die LCL fehlt - der Compiler meckern müsste.

Irgendwie wurstle ich mich schon wieder aus der Situation heraus, ich suche Werkzeug und Ideen fürs Debuggen, so ist das eine frustreierende Probierarbeit die mir Zeit ohne Ende wegfrisst.

Die Grundfrage war und ist aber gleich geblieben: gibt es keine Möglichkeit, den Daemon - so wie unter Windows - anzuhalten bis der Debugger kommt? Jetzt wo ich es aufschreibe fällt mir allerdings ein, da hat doch mal wer was vorgeschlagen: Endlosschleife programmieren, die auf eine Variablenwert abgestellt ist, dann mit dem Debugger einsteigen, und den Inhalt der Variablen so ändern, so dass die Schleife verlassen wird. Dann kann ich direkt dahiner einen Breakpoint setzen. Muss ich gleich mal probieren.

Ich suche aber auch sonst noch Ideen, wie ein Daemon ausnahmsweise mit der Außenwelt kommunizieren kann. Dann könnte ich beim Start mitschreiben wie weit er ungefähr kommt. Ich vermute nämlich, dass er an irgendeiner Rechtesperre hängen bleibt. Ich meine mich zu erinnern, dass man unter Windows z.B. durchaus auf eine Konsole schreiben kann, es braucht aber irgendein wildes Tool von Sysinternals oder Nir um sie sichtbar zu machen. Außerdem hätte ich unter Windows auch noch das Eventlog, da kann ich immer hinschreiben und muss keine dubiosen Rechtesperren fürchten. Bisher jedenfalls.

Armin.

Socke
Lazarusforum e. V.
Beiträge: 3158
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: Linux: wie debuggt man einen daemon!?

Beitrag von Socke »

Bei einer Recherche bin ich nur auf https://stackoverflow.com/questions/438 ... tach-to-it gestoßen. Ob das schnell genug reagiert um deinen daemon an der richtigen Stelle einzufangen, weiß ich nicht.

Dein Daemon könnte aber auch bei Start auf ein Unix-Signal warten. Das Signal kannst du dann ganz bequem senden, nachdem du GDB gestartet hast.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Linux: wie debuggt man einen daemon!?

Beitrag von theo »

Socke hat geschrieben:
Fr 25. Mär 2022, 17:24
Dein Daemon könnte aber auch bei Start auf ein Unix-Signal warten. Das Signal kannst du dann ganz bequem senden, nachdem du GDB gestartet hast.
Die Idee ist vllt. gar nicht so schlecht.
Simplen Code dazu hatte ich hier mal gepostet: viewtopic.php?p=125464#p125464
Z.B. Einfach auf User1Sig (SIGUSR1) warten.

Antworten