Как получить дамп ядра из ловушек: событие общей защиты program[pid]
Я пытаюсь устранить неполадки в локально скомпилированной программе-демоне в Linux, программа падает с сигналом 11, и мне нужно отследить стек и значения переменных, чтобы исправить ошибку.
Однако по какой-то причине ядро Linux не сохраняет дамп ядра, а просто записывает следующее (пока не раскрывая имя программы):
Apr 8 15:22:54 machinename kernel: [ 5032.337089] traps: program[4121] general protection ip:7ff47cbf9614 sp:7ff45f68abb8 error:0
Apr 8 15:22:54 machinename kernel: [ 5032.337110] in libc-2.19.so[7ff47cb7d000+1a1000]
Я уже пытался убедиться, что критерии в core(5) выполняются, но безрезультатно.
Есть ли способ заставить ядро Linux сообщать или регистрировать, почему оно не создает дамп ядра?
Есть ли другой способ исправить эту ситуацию?
Обратите внимание, что этот вопрос отличается от других вопросов по этой теме тем, что: 1. Не относится к названной программе или библиотеке и их особенностям. 2. Поиск ответов, которые будут полезны другим разработчикам, столкнувшимся с этим несколько запутанным поведением ядра.
1 ответ
В конце концов я исправил это, создав собственное ядро с дополнительным кодом, чтобы регистрировать точную причину записи или не записи дампа ядра (это действительно должно быть поведением по умолчанию, но это не так). Оказывается, один из задокументированных критериев (suid_dumpable) был применен, несмотря на то, что демон не является бинарным файлом suid, он просто сбрасывает root при демонизации, что является противоположностью с точки зрения безопасности.
Поэтому я изменил suid_dumpable на 1, получил файл дампа ядра и скопировал его на машину с исходным кодом, а затем пытался заставить gdb загрузить символы (много неясной документации по этому поводу). Но в конце концов я подобрался достаточно близко, чтобы заподозрить причину и реализовать обходной путь в коде демона.
Итак, урок для других: /proc/sys/fs/suid_dumpable применяется к двоичным файлам, которые отбрасывают root для запуска под непривилегированным идентификатором пользователя, несмотря на то, что это параметр для защиты от suid-двоичных файлов, выгружающих читаемые пользователем файлы ядра с привилегированной информацией, полученной под привилегированной учетной записью. .