Dringend: Programm hängt in der Konsole - kann ich sehen wo?
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Dringend: Programm hängt in der Konsole - kann ich sehen wo?
Ich habe einen Telegram-Bot-Client, der auf dem Raspberry Pi 3B unter Raspbian läuft. Normalerweise wird er beim Reboot zeitverzögert gestartet, kontaktiert den Bot und fragt dann regelmäßig, ob Eingaben vorliegen, auf die er dann Daten ausliefert.
Funktioniert soweit. Allerdings "hängt" er sich mitunter auf, sprich, er reagiert nicht mehr auf Eingaben. Wobei ich bisher nicht rausfinden konnte, ob der Client nichts mehr abfragt oder nichts mehr ausliefert. Passiert auch nur sporadisch.
Vor ein paar Tagen hab ich allerdings dran rumgefummelt, und ihn dann direkt in der Konsole gestartet. Das ging bis heute nachmittag gut, jetzt reagiert er wieder nicht mehr. Aber: Er reagiert auch nicht auf Ctrl-C in der Konsole, normalerweise meldet er sich dann ab und das Programm endet. Scheint sich also richtig aufgehängt zu haben.
Nun hab ich das Programm noch in der Konsole liegen: Gibt es eine Möglichkeit herauszufinden, an welcher Stelle das Programm hängt?
Im Taskmanager steht es mit 0% CPU, 5,9MB RSS, 8,1MB Speicher, Status S. Das sind die üblichen Werte, ein Speicherleck scheint es schonmal nicht zu geben. Kompiliert habe ich mit Laz 1.9.0, FPC 3.1.1 per arm-linux Crosscompiler von Windows aus. Jetzt allerdings die schlechte Nachricht: Da per Crosscompiler erstellt, sind sämtliche Debuggereinstellungen ausgeschaltet.
Funktioniert soweit. Allerdings "hängt" er sich mitunter auf, sprich, er reagiert nicht mehr auf Eingaben. Wobei ich bisher nicht rausfinden konnte, ob der Client nichts mehr abfragt oder nichts mehr ausliefert. Passiert auch nur sporadisch.
Vor ein paar Tagen hab ich allerdings dran rumgefummelt, und ihn dann direkt in der Konsole gestartet. Das ging bis heute nachmittag gut, jetzt reagiert er wieder nicht mehr. Aber: Er reagiert auch nicht auf Ctrl-C in der Konsole, normalerweise meldet er sich dann ab und das Programm endet. Scheint sich also richtig aufgehängt zu haben.
Nun hab ich das Programm noch in der Konsole liegen: Gibt es eine Möglichkeit herauszufinden, an welcher Stelle das Programm hängt?
Im Taskmanager steht es mit 0% CPU, 5,9MB RSS, 8,1MB Speicher, Status S. Das sind die üblichen Werte, ein Speicherleck scheint es schonmal nicht zu geben. Kompiliert habe ich mit Laz 1.9.0, FPC 3.1.1 per arm-linux Crosscompiler von Windows aus. Jetzt allerdings die schlechte Nachricht: Da per Crosscompiler erstellt, sind sämtliche Debuggereinstellungen ausgeschaltet.
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Dringend: Programm hängt in der Konsole - kann ich sehen
Was willst du, die PID ?Gibt es eine Möglichkeit herauszufinden, an welcher Stelle das Programm hängt?
Wen du in einer 2. Konsole "ps a" werden alle deine gestarteten Programm gelistet.
Hilft dir dies weiter ?
Siehe auch: https://wiki.ubuntuusers.de/ps/
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 2120
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Dringend: Programm hängt in der Konsole - kann ich sehen
Starte den bot mit gdb über kommandozeile in einer screen (oder tmux) Session detached, und sobald du merkst das er hängt reattachen und mit gdb debuggen.
Ansonsten viel logging betreiben und in die logs schauen
Ansonsten viel logging betreiben und in die logs schauen
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: Dringend: Programm hängt in der Konsole - kann ich sehen
Nee, die steht ja schon im Taskmanager.Mathias hat geschrieben:Was willst du, die PID ?
Das nützt mir gerade nichts, wie gesagt läuft er mitunter tage- oder wochenlang problemlos. Jetzt hängt er gerade so schön und ich hätte gern gewusst an welcher Stelle im Programm, bevor ich das Programm abschieße und neustarte.Warf hat geschrieben:Starte den bot mit gdb über kommandozeile in einer screen (oder tmux) Session detached, und sobald du merkst das er hängt reattachen und mit gdb debuggen.
Gibts nicht sowas wie einen Programmzeiger, der auf den aktuellen Befehl zeigt und den ich von aussen abrufen könnte?
-
- Beiträge: 6918
- Registriert: Do 2. Jan 2014, 17:21
- OS, Lazarus, FPC: Linux (die neusten Trunk)
- CPU-Target: 64Bit
- Wohnort: Schweiz
Re: Dringend: Programm hängt in der Konsole - kann ich sehen
Hast du irgendwelche Timer oder Zeitabfragen eingebaut ?Das nützt mir gerade nichts, wie gesagt läuft er mitunter tage- oder wochenlang problemlos.
Vielleicht hast du dort ein Überrlauf und es fängt wieder von vorn an und dies gibt eine Endlosschleife. Dies ist mir mal passiert. der PC lief mal über Mitternacht und da hat es wider bei 0 begonnen.
Ein Logfile einbauen ?Gibts nicht sowas wie einen Programmzeiger,
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot
Mit Java und C/C++ sehe ich rot
-
- Beiträge: 2120
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Dringend: Programm hängt in der Konsole - kann ich sehen
Dein Problem klingt übrigens nach einem Deadlock. Also zwei Threads warten auf sich gegenseitig. Solche Probleme hatte ich auch viel mit einem TeamSpeak Bot. Da hab ich Informationen über eine Thread List (oder wie die heißt) gemanaged, aber für einen Command brauchte ich eine Antwort, so hat der thread der grad die Liste abbarbeitet auf die Nachricht gewartet die darauf gewartet hat das die Liste freigegeben wird
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: Dringend: Programm hängt in der Konsole - kann ich sehen
Das Programm an sich ist recht simpel, wenn auch noch bißchen Zusatzkram wie Logfile und Configfile dazukommt, so dass ich das hier nicht direkt einstellen kann. Ich vermute mal, es hängt bei einer Serverabfrage. Früher ist es - anscheinend - immer dann hängengeblieben, wenn der Router eine neue IP bekommen hat, aber da bin ich auch nicht sicher.Warf hat geschrieben:Dein Problem klingt übrigens nach einem Deadlock. Also zwei Threads warten auf sich gegenseitig. Solche Probleme hatte ich auch viel mit einem TeamSpeak Bot. Da hab ich Informationen über eine Thread List (oder wie die heißt) gemanaged, aber für einen Command brauchte ich eine Antwort, so hat der thread der grad die Liste abbarbeitet auf die Nachricht gewartet die darauf gewartet hat das die Liste freigegeben wird
Werd mal die Logfunktionen etwas ausbauen und dann nochmal starten.
-
- Beiträge: 2120
- Registriert: Di 23. Sep 2014, 17:46
- OS, Lazarus, FPC: Win10 | Linux
- CPU-Target: x86_64
Re: Dringend: Programm hängt in der Konsole - kann ich sehen
Ich würde die tatsächlich eher empfehlen den GDB zu verwenden Den Bot einfach mit dem GDB im hintergrund starten und warten bis er nix mehr macht, dann in die session Attachen und nachschauen:Timm Thaler hat geschrieben:Das Programm an sich ist recht simpel, wenn auch noch bißchen Zusatzkram wie Logfile und Configfile dazukommt, so dass ich das hier nicht direkt einstellen kann. Ich vermute mal, es hängt bei einer Serverabfrage. Früher ist es - anscheinend - immer dann hängengeblieben, wenn der Router eine neue IP bekommen hat, aber da bin ich auch nicht sicher.
Werd mal die Logfunktionen etwas ausbauen und dann nochmal starten.
Code: Alles auswählen
$ screen -mSL bot "gdb BotExec"
gdb> r
-- STRG + A & STRG + D
#warten
$ screen -r bot
^C -- Strg+C
gdb> backtrace
...
Ist deutlich einfacher als jede Zeile zu loggen (das wichtigste solltest du schon loggen, musst aber nicht so detailiert wie wenn du damit den fehler finden willst). Außerdem kannst du mit dem GDB in variablen reinschauen oder funktionen aufrufen, etc. um zu schauen warum es hängt
-
- Beiträge: 2013
- Registriert: Do 16. Okt 2008, 10:22
- OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
- CPU-Target: x86,x64,ARM
Re: Dringend: Programm hängt in der Konsole - kann ich sehen
Oder die Funktion 'Attach Process' der IDE verwenden. Dazu muss man die Processid des Programms herausfinden.
-
- Beiträge: 1224
- Registriert: So 20. Mär 2016, 22:14
- OS, Lazarus, FPC: Win7-64bit Laz1.9.0 FPC3.1.1 für Win, RPi, AVR embedded
- CPU-Target: Raspberry Pi 3
Re: Dringend: Programm hängt in der Konsole - kann ich sehen
Muhaha, ich glaub ich hab die Stelle gefunden. Ich hab tatsächlich eine Abbruchbedingung gemacht für den Fall, dass der bot nicht auf die Abfrage antwortet. Dann soll er es noch zweimal versuchen und dann warten. Aber: Ich hab den Zähler für den Abbruch an die falsche Stelle gesetzt, so dass er alle 200msec tatsächlich immer wieder abfragt, woraufhin der bot anscheinend wegen DNS gar nicht mehr antwortet.
Dumm gelaufen.
Dumm gelaufen.
