Как программа на С может создать дамп ядра без прерывания?

Я хочу, чтобы программа на С создавала дамп ядра при определенных обстоятельствах. Это программа, которая работает в производственной среде, и ее нелегко остановить и перезапустить для настройки других типов кода отладки. Кроме того, поскольку он находится в производственной среде, я не хочу вызывать abort(). Исследуемые проблемы нелегко тиражируются в непроизводственной среде. Я хотел бы, чтобы программа, когда она обнаруживает определенные проблемы, сама создавала дамп ядра, желательно с достаточным количеством информации для переименования файла, а затем продолжала.

5 ответов

Решение
void create_dump(void)
{
    if(!fork()) {
        // Crash the app in your favorite way here
        abort() || (*((void*)0) = 42);
    }
}

Разорвать процесс, затем разбить ребенка - он даст вам снимок, когда вы хотите

Другим способом может быть использование библиотеки Google Coredumper. Это создает результат, аналогичный технике fork+abort, но лучше работает с многопоточными приложениями (приостанавливает все потоки на некоторое время, прежде чем разветвляется, чтобы они не мешали ребенку).

Пример:

    #include ...
    WriteCoreDump ('core.myprogram');
    / * Продолжайте, мы создали файл ядра,
     * но мы не разбились.
     */

Sun описывает, как получить основной файл для Solaris, HP-UX, Redhat и Windows здесь.

У Solaris есть программа gcore. HP-UX может иметь это. В противном случае используйте gdb и его команду gcore. В Windows есть win-dbg-root\tlist.exe и win-dbg-root\adplus.vbs

Вы действительно хотите ядро ​​или просто трассировку стека? Если все, что вам нужно - это трассировка стека, вы можете взглянуть на открытые исходные коды и попытаться интегрировать код оттуда, или, может быть, достаточно просто вызвать его из командной строки.

Я считаю, что некоторый код в проекте GDB также может быть полезным.

Еще одна мысль, которую вы, возможно, захотите сделать, - это использовать gdb для подключения к запущенному процессу.

$ gdb /path/to/exec 1234 # 1234 is the pid of the running process

Исходный код для создания дампа ядра находится в "gcore", который является частью пакета gdb.

Также у Солнца есть свет.

Кроме того, у вас должен быть отдельный процесс, выполняющий дамп ядра, так как текущий процесс должен быть приостановлен. Вы найдете подробности в исходном коде gcore, или вы можете просто запустить gcore своей платформы с вашим процессом в качестве цели.

Другие вопросы по тегам