Ngay cả khi chương trình bẫy SIGSEGV, gdb vẫn nên nhận nó trước và cho bạn cơ hội gỡ lỗi chương trình. Bạn đã thực hiện điều gì đó như
handle SIGSEGV nostop
trong GDB? Nếu vậy thì đó có thể là lý do tại sao nó không dừng lại.
Bạn có chắc chắn rằng một segfault đang thực sự xảy ra không? Bạn có thể sao chép hành vi này bằng một chương trình khác hoặc bằng cách cố ý gây ra vi phạm phân đoạn không?
Ví dụ:
$ 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
Nguồn
2010-08-05 13:10:24
Bạn chính xác. Chắc chắn, tôi nên bắt gặp lỗi của tiến trình con. Cám ơn. – Blad
Tôi đã thử theo đề xuất của bạn, nhưng một vấn đề khác khiến ứng dụng bị hủy: "shell-init: lỗi truy xuất thư mục hiện tại: getcwd: không thể truy cập thư mục mẹ: Không có tệp hoặc thư mục như vậy". Bất kỳ ý tưởng? – Blad