Как отлаживать программу с обработчиком сигнала для SIGSEGV - PullRequest
7 голосов
/ 05 августа 2010

Я пишу плагин для приложения, иногда SIGSEGV будет выброшен. Однако приложение ловит сигнал SIGSEGV. Другими словами, Плагин - это динамическая библиотека. Ошибка возникает в моем плагине и динамической библиотеке. Но приложение обрабатывает sSIGSEGV и выходит нормально. Так что мне довольно сложно отлаживать и получать обратный след всех кадров стека. Любая идея?

В настоящее время я использую GDB в качестве инструмента отладки.

Ответы [ 2 ]

9 голосов
/ 06 августа 2010

GDB будет ловить SIGSEGV до того, как приложение сделает.

То, что вы описали в комментарии к ответу Логана, не имеет смысла.

Я подозреваю, что на самом деле происходитчто приложение создает новый процесс и получает SIGSEGV только в этом другом процессе, а не в том, к которому вы прикрепили GDB.

Следующие команды могут быть полезны, если мои предположения верны:

(gdb) catch fork
(gdb) catch vfork
(gdb) set follow-fork-mode child

Возможно, вы также захотите отредактировать и расширить ваш вопрос:

  • откуда вы знаете, это a SIGSEGV для начала?
  • Размещение журнала вашего взаимодействия с GDB также может оказаться полезным.
4 голосов
/ 05 августа 2010

Даже если программа перехватывает SIGSEGV, GDB все равно должен получить его первым и дать вам возможность отладить программу. Вы сделали что-то вроде

 handle SIGSEGV nostop

в ГБД? Если так, то это может быть причиной того, почему он не останавливается.

Вы уверены, что на самом деле происходит сбой? Можете ли вы продублировать это поведение другой программой или намеренно вызвать нарушение сегментации?

Например:

$ cat sig.c
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>

void handle(int n)
{
        puts("Bail");
        exit(1);
}

int main()
{
        signal(SIGSEGV, handle);
        int *pi = 0;
        *pi = 10;
        return 0;
}
$ gcc -g sig.c
$ ./a.out
Bail
$ gdb ./a.out
GNU gdb 6.6-debian
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i486-linux-gnu"...
Using host libthread_db library "/lib/tls/i686/cmov/libthread_db.so.1".
(gdb) run
Starting program: /home/elcapaldo/a.out

Program received signal SIGSEGV, Segmentation fault.
0x08048421 in main () at sig.c:15
15              *pi = 10;
(gdb) where
#0  0x08048421 in main () at sig.c:15
(gdb) c
Continuing.
Bail

Program exited with code 01.
(gdb) q
...