Der Prozess wurde abgebrochen – warum? Wie kann ich das herausfinden?

Ich habe ein Computerprogramm in C++ geschrieben, kompiliert und über die Befehlszeile im Terminal ausgeführt. Dieses Programm ist viele Male gut gelaufen, aber es scheint, dass es immer dann, wenn seine kumulierte CPU-Zeit 60 Minuten überschreitet (was nach etwa 9 Minuten auftritt, wenn es mit ~700 % auf acht Threads läuft), vom Laufzeitsystem beendet wird (mindestens das wird vorgeschlagen, indem man es mit überwacht top).

Es gibt keinen Fehler oder eine andere Meldung, sondern lediglich das Wort „Killed“, das in die Befehlszeile gedruckt wird:

MacBook-Pro-8:~/directory> ./program_name options
Killed

Gibt es eine Grenze für die kumulierte CPU-Zeit für solche Prozesse? Wie kann ich herausfinden, was meinen Prozess beendet hat? Wie kann ich das vermeiden?


Nach dem Vorschlag, dies in einem Debugger auszuführen, ist hier das Ergebnis:

Process 90937 stopped
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGKILL
frame #0: 0x000000010001fc50 captureISO`tbb::interface9::internal::start_for<WDutils::Parallel::details::blocked_range_terminating<unsigned long>, (anonymous namespace)::simulations::sampleSome(bool)::$_2, tbb::auto_partitioner const>::run_body(WDutils::Parallel::details::blocked_range_terminating<unsigned long>&) [inlined] tbb::concurrent_vector<(anonymous namespace)::simulations::initialCondition, tbb::cache_aligned_allocator<(anonymous namespace)::simulations::initialCondition> >::push_back(this=0x00007fff5fbfebd0)::simulations::initialCondition const&) at concurrent_vector.h:846 [opt]
   843      iterator push_back( const_reference item )
   844      {
   845          push_back_helper prolog(*this);
-> 846          new(prolog.internal_push_back_result()) T(item);
   847          return prolog.return_iterator_and_dismiss();
   848      }
   849  

Daher trat der Fehler in tbb_concurrent_vector.heinem Call to Placement auf new, was auf einen Speichermangel hindeutet. Obwohl ich immer noch verwirrt bin, warum dies zu einem Kill-Signal führen sollte. Aber das scheint hier off-topic zu sein. Ich habe auf Stack Overflow gefragt .

Im Code fangen Sie Signale ab?
@ Mark Nein, tue ich nicht

Antworten (2)

Im Allgemeinen gibt es keine Begrenzung der kumulierten CPU-Zeit für Prozesse unter macOS.

Es scheint wahrscheinlich, dass Ihr Programm aufgrund von Problemen wie Programmfehlern, Speichermangel oder ähnlichem gestoppt wurde. Um herauszufinden, was passiert ist, versuchen Sie, Ihr Programm im Debugger zu starten, und sehen Sie sich den Backtrace an.

Außerdem sollten Sie den Signalhandler im Programm durch einen ersetzen, der ausgibt, welches Signal er empfängt. Sie könnten das Programm möglicherweise auch so ändern, dass es sich beim Empfang des Signals nicht selbst beendet, sondern stattdessen etwas tut - wie zum Beispiel Speicher freigibt. Es hängt vom empfangenen Signal ab, ob es ignoriert werden kann oder nicht.

Sie sollten den Signalhandler im Programm durch einen ersetzen, der ausgibt, welches Signal er empfängt - wie kann ich das tun?
Dies ist definitiv nicht die unmittelbare Folge eines Fehlers, sondern möglicherweise aufgrund von Speichermangel. In diesem Fall würde ich jedoch erwarten, dass der Code zuerst mit dem Austausch beginnt. Das passiert aber nicht.
@Walter Möglicherweise müssen Sie diese Folgefrage auf einer Programmierseite stellen, da wir uns auf Skripterstellung und die Funktionsweise des Betriebssystems konzentrieren. Die themenbezogene Antwort hier ist, dass das Betriebssystem keine gesendeten Signale protokolliert. Auch das Aktivieren der Protokollierung könnte etwas Arbeit sein, aber das Ausführen in einem Debugger könnte Ihnen helfen, die Beendigungsursache zu finden?
Die Frage nach dem Ersetzen des Signalhandlers im Programm ist jedoch für Stack Overflow zu weit gefasst, da Sie nicht nur Code ausschneiden und einfügen sollten, sondern auch ein gewisses Verständnis dafür benötigen, was Signale sind.
Schauen Sie sich die Bearbeitung von @Mark an - es wird sigkill und es gibt Code - also wird dies wahrscheinlich nicht als Nicht-MCVE auf SO erwischt. Walter ist eindeutig kompetent und kommt direkt zur Sache.
@Walter Versuchen Sie, den Speicherverbrauch während der Ausführung des Programms mit top zu überprüfen. Scheint, als würden Sie viel zuweisen, tauschen und schließlich den OOM-Killer provozieren, um Ihr Programm zu stoppen.
Die Verwendung von tbb macht die Dinge komplexer, aber siehe software.intel.com/en-us/articles/… @bmike es ist bei weitem nicht in der Nähe eines MCVE, dass sich Code in einer großen Bibliothek eines Drittanbieters befindet. Mein Kommentar zu den Signalen ist nicht so relevant

Hier habe ich die endgültige Lösung. Ich habe viele ausprobiert, die beste Methode ist die Neuinstallation von Brew.

Schritt 1:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall.sh)"

Schritt 2: Homebrew installieren

cd /opt 
mkdir homebrew # if not exist, just create one.
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew

Dann Problem gelöst.

Sind Sie sicher, dass diese Antwort für diese Frage gilt?