Может ли GDB автоматически прикрепить процесс на SIGSEGV - PullRequest
8 голосов
/ 13 июля 2010

У меня есть неисправная программа, которая при выполнении получает SIGSEGV.

Я могу использовать GDB следующим образом:

$ gdb ./prog 

Но я бы предпочел, чтобы GDB ловил SIGSEGV из progи прикрепите его автоматически.

$ ./prog
Segmentation Fault
(gdb) ...

Есть ли способ сделать это?

Спасибо

Ответы [ 3 ]

12 голосов
/ 13 июля 2010

Хм. Вы можете настроить обработчик сигнала для запуска отладчика с текущим процессом. Таким образом, вы можете проверить все состояние "вживую".

#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 для исправления.

3 голосов
/ 13 июля 2010

Ну, вы всегда можете создать файл ядра и затем проанализировать стек вызовов, используя gdb для этого ядра. Вы можете проверить страницу справки для ulimit, чтобы сделать это.

Проверьте эту ссылку для получения дополнительной информации .

1 голос
/ 15 февраля 2018

Чтобы добавить ответ на мэйнфрейм, вы можете связать свое приложение с libdebugme (или просто LD_PRELOAD it) для достижения аналогичной функциональности. Например:

DEBUGME_OPTIONS=handle_signals=1 LD_PRELOAD=libdebugme.so ./app
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...