Я пишу плагин для приложения, иногда SIGSEGV был бы, выводят. Однако приложение ловит сигнал SIGSEGV. В другом слове плагин является динамической библиотекой. Ошибка происходит в моей сменной и динамической библиотеке. Но applcation обычно обрабатывают sSIGSEGV и выход. Так, для меня довольно трудно отладить и получить след всех стековых фреймов. Какая-либо идея?
В настоящее время я использую gdb в качестве отладчика.
GDB будет перехватить SIGSEGV
до того, как это сделает приложение.
То, что вы описали в комментарии к ответу Логана, не имеет смысла.
Я подозреваю, что на самом деле происходит то, что приложение создает новый процесс и получает SIGSEGV
только в этом другом процессе, а не в том, к которому вы подключили GDB.
Следующие команды могут быть полезны, если мое предположение верное:
(gdb) catch fork
(gdb) catch vfork
(gdb) set follow-fork-mode child
Вы также можете отредактировать и расширить свой вопрос:
SIGSEGV
для начала? GDB
. Даже если программа ловит 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