Я хочу, чтобы программа C создавала дамп ядра при определенных обстоятельствах. Это программа, которая работает в производственной среде и не легко останавливается и перезапускается для настройки других типов кода отладки. Кроме того, поскольку он в производственной среде, я не хочу вызывать abort(). Расследуемые вопросы нелегко реплицируются в непроизводственной среде. Я хочу, чтобы программа, когда она обнаруживала определенные проблемы, сама создавала дамп ядра, желательно с достаточной информацией для переименования файла, а затем продолжайте.
Как программа C может выдать основной дамп без остановки?
Ответ 1
void create_dump(void)
{
if(!fork()) {
// Crash the app in your favorite way here
abort() || (*((void*)0) = 42);
}
}
Завершите процесс, а затем сбой ребенка - он даст вам снимок, когда вы захотите
Ответ 2
Другим способом может быть использование библиотеки Google Coredumper. Это создает аналогичный результат для технологии fork + abort, но лучше работает с многопоточными приложениями (приостанавливает все потоки в течение некоторого времени перед форкингом, чтобы они не делали беспорядок в дочернем элементе).
Пример:
#include <google/coredumper.h> ... WriteCoreDump('core.myprogram'); /* Keep going, we generated a core file, * but we didn't crash. */
Ответ 3
Sun описывает, как получить основной файл в Solaris, HP-UX, Redhat и Windows здесь.
В Solaris есть программа gcore. HP-UX может иметь это. В противном случае используйте gdb и его gcore commmand. Windows имеет win-dbg-root\tlist.exe и win-dbg-root\adplus.vbs
Ответ 4
Вы действительно хотите ядро или просто стек? Если все, что вам нужно, это stacktrace, вы можете взглянуть на openource здесь и попытаться интегрировать код оттуда или просто вызвать его из командной строки достаточно.
Я считаю, что некоторый код в проекте gdb также может быть полезен.
Другое, что вы, возможно, захотите сделать, это использовать gdb для присоединения к запущенному процессу.
$ gdb /path/to/exec 1234 # 1234 is the pid of the running process
Ответ 5
Исходный код для создания дампа ядра находится в 'gcore', который является частью пакета gdb.
Кроме того, у Солнца gcore.
Кроме того, у вас должен быть отдельный процесс, выполняющий дамп ядра, поскольку текущий процесс должен быть приостановлен. Вы найдете подробности в источнике gcore, или вы можете просто запустить свою платформу gcore с вашим процессом в качестве цели.