Я хочу, чтобы программа на C создавала дамп ядра при определенных обстоятельствах. Это программа, которая работает в производственной среде, и ее нелегко остановить и перезапустить для настройки других видов отладочного кода. Кроме того, поскольку он находится в производственной среде, я не хочу вызывать abort (). Исследуемые проблемы нелегко воспроизвести в непроизводственной среде. Я бы хотел, чтобы программа при обнаружении определенных проблем самостоятельно создавала дамп ядра, желательно с достаточным количеством информации для переименования файла, а затем продолжала.
Как программа на C может создать дамп ядра, не прерываясь?
Ответы (5)
void create_dump(void)
{
if(!fork()) {
// Crash the app in your favorite way here
*((void*)0) = 42;
}
}
Разветвите процесс, а затем обрушьте дочерний элемент - он предоставит вам моментальный снимок, когда вы захотите
|| (*((void*)0) = 42)
?
- person hudac; 02.06.2016
Другой способ - использовать библиотеку Google Coredumper. Это дает результат, аналогичный методу fork + abort, но лучше работает с многопоточными приложениями (приостанавливает на некоторое время все потоки перед разветвлением, чтобы они не создавали беспорядка в дочернем элементе).
Пример:
#include <google/coredumper.h> ... WriteCoreDump('core.myprogram'); /* Keep going, we generated a core file, * but we didn't crash. */
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.
Кроме того, у Sun есть gcore.
Кроме того, у вас должен быть отдельный процесс, выполняющий дамп ядра, поскольку текущий процесс должен быть приостановлен. Вы найдете подробности в источнике gcore, или вы можете просто запустить gcore своей платформы с вашим процессом в качестве цели.