Beim Durchblättern von glib/gmessages.c habe ich den starken Eindruck, dass G_LOG_FLAG_RECURSION
gesetzt ist, wenn g_logv()
muss selbst einen Fehler protokollieren.
Wenn ein Versuch, Speicher zuzuweisen, fehlschlägt, wird das Programm versuchen, den Fehler bei der Speicherzuweisung zu protokollieren, und sich wahrscheinlich beenden. Wenn die Protokollierungsroutine versucht, Speicher zuzuweisen, um die Meldung zu protokollieren, wird sie wahrscheinlich scheitern. Die Protokollierungsroutinen behalten also im Auge, wie "tief" sie aufgerufen wurden, und wechseln die Speicherzuweisungsstrategie (sie weisen den Speicher auf dem Stack statt auf dem Heap zu), wenn es sich um einen rekursiven Protokollierungsaufruf handelt.
Immer wenn die Protokollierungsroutinen eine Fehlermeldung erhalten und den Fehler protokollieren wollen, muss etwas まったくもって Es macht also Sinn, zu versuchen, sich mit einem anderen Mechanismus anzumelden und dann zu beenden.
Sie sehen also wahrscheinlich nur ein weit entferntes Symptom des eigentlichen Problems. Sie könnten verwenden ltrace(1)
um zu versuchen, das Problem zu erkennen, oder Sie könnten Kernspeicherauszüge aktivieren ( ulimit -c unlimited
) und versuchen Sie, die Aufrufkette zu finden, die das Programm zum Absturz bringt, indem Sie gdb's bt
Befehl.