Как отладить программу с обработчиком сигналов для SIGSEGV

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

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

8
задан Blad 5 August 2010 в 12:59
поделиться

2 ответа

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

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

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

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

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

Вы также можете отредактировать и расширить свой вопрос:

  • откуда вы знаете, что это SIGSEGV для начала?
  • Также может оказаться полезным публикация журнала вашего взаимодействия с GDB .
10
ответ дан 5 December 2019 в 12:07
поделиться

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

 handle SIGSEGV nostop

в GDB? Если да, то это может быть причиной того, что программа не останавливается.

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

Например:

$ 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
4
ответ дан 5 December 2019 в 12:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: