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

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

Ответ 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 с вашим процессом в качестве цели.