Как программа на С может создать дамп ядра без прерывания? - PullRequest
30 голосов
/ 25 сентября 2008

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

Ответы [ 5 ]

57 голосов
/ 25 сентября 2008
void create_dump(void)
{
    if(!fork()) {
        // Crash the app in your favorite way here
        abort() || (*((void*)0) = 42);
    }
}

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

6 голосов
/ 10 июля 2014

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

Пример:

    #include <google/coredumper.h>
    ...
    WriteCoreDump('core.myprogram');
    /* Keep going, we generated a core file,
     * but we didn't crash.
     */
3 голосов
/ 25 сентября 2008

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

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

3 голосов
/ 25 сентября 2008

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

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

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

$ gdb /path/to/exec 1234 # 1234 is the pid of the running process
2 голосов
/ 25 сентября 2008

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

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

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

...