Я установил точки останова при выходе и _exit, и моя программа (многопоточное приложение, работающая на linux 2.6.16.46-0.12 sles10), как-то все еще выходит, так что я не могу найти
(gdb) c ... [New Thread 47513671297344 (LWP 15279)] [New Thread 47513667103040 (LWP 15280)] [New Thread 47513662908736 (LWP 15281)] Program exited with code 0177. (gdb)
функции выхода находятся в libc, поэтому нет проблем с разделяемой библиотекой отложенной нагрузки. Кто-нибудь знает какой-то другой таинственный триггер для выхода, который нельзя поймать?
РЕДАКТИРОВАТЬ: проблема теперь только академическая. Я попробовал двоичную поисковую отладку, выделив подмножество моих изменений (проблема исчезла). После того, как я применил их снова последовательно, я больше не могу воспроизвести проблему, даже если вещи восстановлены в исходное состояние.
EDIT2: Недавно я нашел одну причину такого рода ошибок, который, возможно, был исходным источником этой проблемы. По историческим причинам наш продукт использует злой флаг компоновщика -Bsymbolic. Среди побочных эффектов этого является то, что когда символ undefined, но вызываемый, компоновщик времени выполнения GLIBC будет бомбить именно таким образом, и вы видите его в отладчике как процесс, выходящий с 0177. Когда компоновщик времени выполнения прерывает этот путь, Я бы предположил, что syscall явно работает _exit (вместо использования библиотеки времени выполнения C() или _exit()). Это было бы согласуется с тем фактом, что я не смог поймать это с помощью контрольных точек выхода в отладчике.