Принудительное создание дампа ядра из активной, нормально работающей программы во FreeBSD

Пишу код обработки ошибок для сервера на FreeBSD. Для чрезвычайно серьезных ошибок я хочу избежать повреждения данных, немедленно завершив работу. Это легко, exit(3). Перед выходом я вывожу соответствующие переменные, которые привели меня туда. Однако в идеале это прекращение должно сопровождаться .core, чтобы я мог полностью исследовать, что привело меня к этому катастрофическому (и, вероятно, трудно воспроизводимому) состоянию.

Как я могу заставить это произойти?


person Nektarios    schedule 03.07.2011    source источник


Ответы (4)


kill -QUIT process_id приведет к созданию дампа ядра из запущенного процесса (при условии, что это позволяют ограничения ресурсов).

Или см. man 3 abort, чтобы заставить программу сбрасывать саму себя.

Добавлено: в интерактивной оболочке запущенную программу можно прервать с помощью клавиши выхода, обычно Ctrl+\, которая отправляет сигнал SIGQUIT. точно так же, как более распространенный Ctrl+C отправляет SIGINT. Это идентично kill -QUIT…, просто его легче ввести, если вы находитесь на управляющем терминале. См. man 1 stty, если ваша клавиша выхода по умолчанию отличается.

person msw    schedule 03.07.2011
comment
Вы также можете использовать kill -3 [pid] — то же самое, меньше печатать. Вы можете увидеть другие флаги убийства на странице руководства: man kill. - person smcphill; 03.07.2011
comment
Ну, я хочу сделать это из самого процесса; так что abort(3) выглядит нормально, но после некоторого тестирования здесь я, похоже, не могу получить доступ к каким-либо символам при изучении полученного .core. Я могу получить обратную трассировку, но если я попытаюсь напечатать любую из моих переменных, они не будут найдены. Это ожидается с abort(3) или я делаю что-то глупое? gcc -g -O0 test.c -o test потом ./test потом gdb ./test test.core - person Nektarios; 03.07.2011
comment
Я думаю, что ваша проблема связана с использованием gdb: вам нужно выбрать кадр из обратной трассировки where, чтобы дать область действия именам переменных. См. sourceware.org/gdb/current/onlinedocs/gdb/ - person msw; 04.07.2011

Это помогло мне! kill -11 всегда работает для меня. 11 — это SIGSEGV (неверная ссылка на память)

person Aadishri    schedule 13.06.2017


На sles12.. Ниже код работал у меня:

kill -11

Предыдущие предложения ничего не дали.

person Marvin    schedule 17.07.2018