2010-07-13 23 views
8

Tôi có một chương trình bị lỗi khi thực thi nhận SIGSEGV.Có thể gdb tự động đính kèm một quy trình trên SIGSEGV

tôi có thể sử dụng gdb như thế này:

$ gdb ./prog 

Nhưng tôi muốn rằng gdb bắt SIGSEGV từ prog và đính kèm nó tự động.

$ ./prog 
Segmentation Fault 
(gdb) ... 

Có cách nào để làm điều đó không?

Cảm ơn

Trả lời

12

Hmm. Bạn có thể thiết lập trình xử lý tín hiệu để khởi chạy trình gỡ rối với quy trình hiện tại. Bằng cách đó bạn có thể kiểm tra toàn bộ trạng thái "sống".

#include <signal.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 

const char *prog=0; 
void fn(int signum) 
{ 

    char buf[256]; 
    snprintf(buf,255,"ddd %s %d",prog,getpid()); 
    system(buf); 
} 
int main(int argc, char **argv) 
{ 
    prog=argv[0]; 
    signal(SIGSEGV,&fn); 
    int *p=0; 
    int k=*p; 
} 

CẬP NHẬT: Được tổ chức theo đề xuất của miedwar và Fanatic23. Các bản phân phối Ubuntu hiện tại được định cấu hình để không cho phép gỡ lỗi các quy trình không phải con. Xem https://askubuntu.com/questions/41629/after-upgrade-gdb-wont-attach-to-process để sửa chữa.

+1

+1 điều cần biết bạn có thể nhận tín hiệu này, btw, bạn cần thoát() sau hệ thống() để nó không được gọi nhiều lần. – miedwar

+1

Nguyên mẫu cho fn cần một đối số nguyên để lấy mã được biên dịch. – Fanatic23

3

Bạn luôn có thể tạo tệp lõi và sau đó phân tích callstack bằng gdb trên lõi đó. Bạn có thể kiểm tra trang của người đàn ông để biết điều đó.

Check this link for more info.

1

Để thêm vào câu trả lời của Mainframe, bạn có thể liên kết ứng dụng của mình với libdebugme (hoặc chỉ đơn giản là LD_PRELOAD) để đạt được chức năng tương tự. Ví dụ:

DEBUGME_OPTIONS=handle_signals=1 LD_PRELOAD=libdebugme.so ./app 
Các vấn đề liên quan