Kann eine Console vollaufen?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Kann eine Console vollaufen?

Beitrag von NicTheQuick »

Klingt fast so als war der oom-Killer am Werk. Bist du sicher, dass du genug RAM hast und der nicht vollläuft? Passiert es auch außerhalb der IDE als fertig kompiliertes Executable? Der Purebasic-Debugger ist manchmal schlecht darin bestimmte Abstürze des Programms zu erkennen und behauptet dann es würde immer noch laufen. Tatsächlich hat die IDE aber nur nicht mitbekommen, dass es schon abgestürzt ist. Es kommt drauf an welche Art von Absturz oder Kill-Signal es war. Es gibt ja verschiedene.
Bild
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Kann eine Console vollaufen?

Beitrag von stevie1401 »

RAM habe ich mehr als genug!
Und ja, das Programm stürzt als fertiges Programm auch manchmal ab, deshalb lasse ich es jetzt ja in der IDE laufen, um herauszufinden wo der Fehler ist.
Aber unter diesen Umständen ist das natürlich echt schwer herauszufinden.
Was ist ein oom-Killer?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Kann eine Console vollaufen?

Beitrag von NicTheQuick »

"out of memory"-Killer. Der Linux-Kernel vergibt für Prozesse verschiedene Scores, anhand derer sie gekillt werden, falls zu wenig RAM zur Verfügung steht. Das kann man natürlich konfigurieren und auch für einzelne Prozesse komplett deaktivieren, aber wenn du keinen Arbeitsspeicher-Mangel hast, dann ist das eh egal.
Du kannst ja mal dein Programm mit strace laufen lassen:

Code: Alles auswählen

strace deinProgramm
Das wird dir tonnenweise Kernel-Calls ausgeben und vielleicht siehst du dann, was zuletzt getan wurde bevor es abstürzt.
Aber bevor du das probierst, ruf auch mal "dmesg" auf und guck, ob direkt nach dem Absturz des Programms dort etwas merkwürdiges zu finden ist. Mit "dmesg -w" kannst du es auch einfach in einem eigenen Terminal laufen lassen und siehst in Echtzeit, was passiert. Mit STRG+C einfach beenden.
Nächste Idee: Mit gdb debuggen.

Code: Alles auswählen

$ gdb deinProgramm
GNU gdb (Ubuntu 9.2-0ubuntu1~20.04) 9.2
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from deinProgramm...
(No debugging symbols found in deinProgramm)
(gdb) run
Wenn das Programm abstürzt, wirst du eine Fehlermeldung sehen und wenn es nicht ganz abgeschmiert ist, kannst du dir dann den Backtrace anschauen:

Code: Alles auswählen

(gdb) bt
Und mit q beenden.

Noch eine Idee: Was sagt dein "ulimit"?

Code: Alles auswählen

nicolas@tp-w530:~$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 126521
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 99
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 126521
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
Meine Prozesse dürfen standardmäßig nur 1024 Dateien gleichzeitig öffnen. Und üblicherweise zählen Netzwerkverbindungen zu den Dateien. Wenn du also mehr als 1024 Verbindungen öffnest plus die ganzen anderen Dinge, die im Hintergrund vielleicht noch passieren, dann schießt der Kernel deinen Prozess möglicherweise auch ab. Oder er lässt zumindest keine neuen Verbindungen mehr zu und dein Purebasic-Programm rechnet damit nicht und stürzt einfach ab.
Bild
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Kann eine Console vollaufen?

Beitrag von stevie1401 »

Puha, das klingt alles mächtig kompliziert, aber ich werde mal versuchen zu testen...
Vielen Dank!
:)
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
stevie1401
Beiträge: 659
Registriert: 19.10.2014 15:51
Kontaktdaten:

Re: Kann eine Console vollaufen?

Beitrag von stevie1401 »

Ich bemerke gerade, dass die Linux IDE NIE bemerkt, wenn man die Konsole schließt, die man mit openconsole() geöffnet hat. Da läuft die IDE einfach weiter.
Das bedeutet ja, das der Debugger überhaupt nicht mitbekommt, dass das Prog nicht mehr läuft. Da kann das Debuggen ja nicht so dolle sein.

Die Windows IDE bemerkt das sofort und schaltet in den normalen Bearbeitungsmodus.
Ist das so gewollt?
Ich programmiere nur noch mit Linux.
Linux Mint 21.x
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Kann eine Console vollaufen?

Beitrag von #NULL »

Ist bei mir nicht so. Der Debugger beendet sich ganz normal.
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten