У меня есть дефектная программа, которые, когда выполняются, получают SIGSEGV.
Я могу использовать gdb как это:
$ gdb ./prog
Но я предпочел бы, чтобы gdb поймали SIGSEGV от prog
и присоедините его автоматически.
$ ./prog
Segmentation Fault
(gdb) ...
Существует ли способ сделать это?
Спасибо
Хм. Вы можете настроить обработчик сигналов для запуска отладчика с текущим процессом. Таким образом, вы можете «вживую» осмотреть все состояние.
#include <signal.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
const char *prog=0;
void fn(int signum)
{
char buf[256];
snprintf(buf,255,"ddd %s %d",prog,getpid());
system(buf);
}
int main(int argc, char **argv)
{
prog=argv[0];
signal(SIGSEGV,&fn);
int *p=0;
int k=*p;
}
ОБНОВЛЕНИЕ: Изменено согласно предложениям miedwar и Fanatic23. Текущие дистрибутивы Ubuntu настроены так, чтобы запрещать отладку не дочерних процессов. См. Исправление https://askubuntu.com/questions/41629/after-upgrade-gdb-wont-attach-to-process .
Ну, вы всегда можете создать файл ядра, а затем проанализировать стек вызовов с помощью gdb на этом ядре. Вы можете проверить страницу руководства для ulimit, чтобы сделать это.
Для получения дополнительной информации перейдите по этой ссылке .