2008-09-25 2 views
26

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

ответ

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

Fork процесс затем аварии ребенка - это даст вам снимок всякий раз, когда вы хотите

+0

Ooohh, это очень здорово - мне всегда приходилось поднимать (6) и перезапускать процесс. – paxdiablo 2008-09-25 05:44:43

1

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

Кроме того, Солнце имеет gcore.

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

3

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

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

3

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

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

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

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

Примечание: вопрос о запуске GDB из самого приложения: http://stackoverflow.com/questions/3151779/how-its-better-to-invoke-gdb-from- program-to-print-its-stacktrace – 2014-04-16 00:00:51

4

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

Пример:

 
    #include <google/coredumper.h> 
    ... 
    WriteCoreDump('core.myprogram'); 
    /* Keep going, we generated a core file, 
    * but we didn't crash. 
    */ 
Смежные вопросы