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.h
einem 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 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.
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.
mmmmmm
Walter