Как программно вызвать дамп ядра в C/C++

Самая глупая ошибка в истории, убедитесь, что вы компилируете свой js-код.

84
задан Cœur 23 March 2017 в 15:36
поделиться

7 ответов

Повышение уровня сигнала № 6 ( SIGABRT в Linux) - это один из способов сделать это (хотя имейте в виду, что SIGABRT не требует, чтобы было 6 во всех реализациях POSIX, поэтому вы можете использовать само значение SIGABRT , если это не является чем-то другим, кроме быстрого кода отладки).

#include <signal.h>
: : :
raise (SIGABRT);

Вызов abort () также вызовет дамп ядра, и вы даже можете сделать это без завершения процесса, вызов fork () с последующим abort () только в дочернем элементе - см. этот ответ для подробностей.

67
ответ дан 24 November 2019 в 08:27
поделиться

Несколько лет назад Google выпустил библиотека coredumper .

Обзор

Библиотека coredumper может быть скомпилирована в приложения для создания дампов ядра работающей программы - без завершения работы. Он поддерживает как однопоточные, так и многопоточные дампы ядра, даже если ядро ​​изначально не поддерживает многопоточные файлы ядра.

Coredumper распространяется в соответствии с условиями лицензии BSD.

Пример

нет означает полный пример; он просто дает вам представление о том, как выглядит API coredumper.

 #include 
...
WriteCoreDump ('core.myprogram');
/ * Продолжаем, мы сгенерировали файл ядра,
 * но мы не разбились.
 * /

Это не то, о чем вы просили, но, может быть, даже лучше :)

70
ответ дан 24 November 2019 в 08:27
поделиться

Как указано в странице руководства по сигналам , любой сигнал с действием, указанным как «ядро», вызовет дамп ядра. Вот несколько примеров:

SIGQUIT       3       Core    Quit from keyboard
SIGILL        4       Core    Illegal Instruction
SIGABRT       6       Core    Abort signal from abort(3)
SIGFPE        8       Core    Floating point exception
SIGSEGV      11       Core    Invalid memory reference

Убедитесь, что вы включили дампы ядра:

ulimit -c unlimited
35
ответ дан 24 November 2019 в 08:27
поделиться
#include <stdlib.h>   // C
//#include <cstdlib>  // C++

void core_dump(void)
{
    abort();
}
31
ответ дан 24 November 2019 в 08:27
поделиться

Invoke

abort();

Связано, иногда вы ' d, как обратная трассировка без фактического дампа ядра, и позволить программе продолжить работу: проверьте функции glibc backtrace () и backtrace_symbols (): http://www.gnu.org/s/libc/manual/html_node/Backtraces.html

11
ответ дан 24 November 2019 в 08:27
поделиться

Вы можете использовать kill (2) для отправки сигнала.

#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);

Итак,

kill(getpid(), SIGSEGV);
4
ответ дан 24 November 2019 в 08:27
поделиться
#include <assert.h>
.
.
.
     assert(!"this should not happen");
0
ответ дан 24 November 2019 в 08:27
поделиться