2010-08-05 47 views
6

Tôi đang viết một plugin cho một ứng dụng, thỉnh thoảng một SIGSEGV sẽ bị loại bỏ. Tuy nhiên, ứng dụng bắt tín hiệu SIGSEGV. Nói cách khác, Plugin là một thư viện động. Lỗi xảy ra trong plugin và thư viện động của tôi. Nhưng applcation xử lý sSIGSEGV và thoát ra bình thường. Vì vậy, nó là khá khó khăn cho tôi để gỡ lỗi và nhận được backtrace của tất cả các khung stack. Bất kỳ ý tưởng?Làm thế nào để gỡ lỗi chương trình với bộ xử lý tín hiệu cho SIGSEGV

Hiện tại tôi đang sử dụng gdb làm công cụ gỡ lỗi.

Trả lời

6

GDB sẽ bắt SIGSEGV trước khi áp dụng thực hiện.

Điều bạn mô tả trong nhận xét về câu trả lời của Logan không có ý nghĩa gì.

Tôi nghi ngờ điều thực sự xảy ra là ứng dụng tạo ra một quy trình mới và chỉ nhận được SIGSEGV trong quy trình khác, chứ không phải là quy trình bạn đính kèm GDB.

Các lệnh sau đây có thể hữu ích nếu tôi đoán là đúng:

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

Bạn cũng có thể muốn chỉnh sửa và mở rộng câu hỏi của bạn:

  • làm thế nào để bạn biết có một SIGSEGV để bắt đầu với?
  • Đăng nhật ký tương tác của bạn với GDB cũng có thể hữu ích.
+0

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

+0

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

4

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 
+0

Cảm ơn bạn rất nhiều vì đã trả lời. Không, thực sự, tôi đã sử dụng "xử lý tất cả các điểm dừng", và nó đã không hoạt động. Ngay cả khi tôi đã cố gắng "xử lý tất cả nopass", các ứng dụng vẫn còn bắt SIGSEGV, và thoát bình thường. – Blad

+0

Đúng, tôi đã sửa lại lần nữa. Dường như vụ va chạm xảy ra trong một quá trình dân gian. – Blad

Các vấn đề liên quan