Просматривая файл glib / gmessages.c, я получаю очень сильное впечатление, что G_LOG_FLAG_RECURSION
установлено, если g_logv()
необходимо зарегистрировать саму ошибку.
Рассмотрим нехватку памяти; если попытка выделения памяти не удалась, программа попытается зарегистрировать ошибку выделения памяти и, возможно, завершится. Когда подпрограмма регистрации пытается выделить память для регистрации сообщения, она, вероятно, потерпит неудачу. Таким образом, подпрограммы ведения журнала отслеживают, насколько «глубокими» они были вызваны, и переключают стратегию выделения памяти (они выделяются в стеке, а не в куче), если это рекурсивный вызов ведения журнала.
Каждый раз, когда подпрограммы регистрации получают сообщение об ошибке и хотят регистрировать ошибку, происходит что-то действительно плохое, поэтому имеет смысл попытаться войти в систему с другим механизмом и затем выйти.
Так что вы, вероятно, просто видите отдаленный симптом настоящей проблемы. Вы можете использовать ltrace(1)
, чтобы попытаться определить проблему, или включить дампы ядра (ulimit -c unlimited
) и попытаться найти цепочку вызовов, вызывающую сбой программы, с помощью команды bt
gdb.