2008-09-25 14 views
26

Tôi muốn một chương trình C để sản xuất một bãi chứa cốt lõi trong những trường hợp nhất định. Đây là một chương trình chạy trong môi trường sản xuất và không dễ dàng dừng lại và khởi động lại để điều chỉnh các loại mã gỡ lỗi khác. Ngoài ra, vì nó ở trong môi trường sản xuất, tôi không muốn gọi hủy bỏ(). Các vấn đề được điều tra không dễ dàng được nhân rộng trong một môi trường phi sản xuất. Những gì tôi muốn là cho chương trình, khi nó phát hiện một số vấn đề, để sản xuất một bãi chứa lõi trên riêng của mình, tốt nhất là với đủ thông tin để đổi tên các tập tin, và sau đó tiếp tục.Làm thế nào một chương trình C có thể tạo ra một vùng lõi của chính nó mà không chấm dứt?

Trả lời

53
void create_dump(void) 
{ 
    if(!fork()) { 
     // Crash the app in your favorite way here 
     abort() || (*((void*)0) = 42); 
    } 
} 

Fork quá trình này sau đó sụp đổ đứa trẻ - nó sẽ cung cấp cho bạn một bản chụp bất cứ khi nào bạn muốn

+0

Ooohh, điều đó rất tiện lợi - tôi luôn phải nâng cao (6) và khởi động lại quá trình. – paxdiablo

+1

Việc này sẽ giết cha mẹ. Đứa trẻ trả về 0 từ ngã ba(). –

+0

Tôi có thể sử dụng phương pháp này để tạo ra một lõi-dump khi xử lý tín hiệu segfault một lần, nhưng không muốn chấm dứt? Tôi muốn viết một chương trình toàn màn hình và tôi vẫn đang cân nhắc các tùy chọn của mình, về cách xử lý các lỗi có thể mà không phải rời khỏi chương trình của tôi, nếu điều đó là có thể. –

1

Mã nguồn để tạo vùng kết xuất lõi nằm trong 'gcore', là một phần của gói gdb.

Ngoài ra, Mặt trời có gcore.

Ngoài ra, bạn phải có một quy trình riêng biệt chạy kết xuất lõi, vì quy trình hiện tại phải bị tạm ngưng. Bạn sẽ tìm thấy các chi tiết trong nguồn gcore, hoặc bạn chỉ có thể chạy gcore của nền tảng của bạn với quá trình của bạn như là mục tiêu.

3

Mặt trời mô tả cách tải tệp lõi trên Solaris, HP-UX, Redhat và Windows here.

Solaris có chương trình gcore. HP-UX có thể có nó. Nếu không, hãy sử dụng gdb và dấu phẩy gcore của nó. Windows có win-dbg-root \ tlist.exe và win-dbg-root \ adplus.vbs

3

Bạn có thực sự muốn một lõi hay chỉ một stacktrace? Nếu tất cả những gì bạn muốn là một stacktrace bạn có thể xem xét mã nguồn mở here và thử và tích hợp mã từ đó, hoặc có thể chỉ cần gọi nó từ dòng lệnh là đủ.

Tôi tin rằng một số mã trong dự án gdb cũng có thể hữu ích.

Một suy nghĩ khác mà bạn có thể muốn làm là sử dụng gdb để đính kèm vào quy trình đang chạy.

$ gdb /path/to/exec 1234 # 1234 is the pid of the running process 
+0

Lưu ý: các câu hỏi về việc chạy gdb từ bản thân ứng dụng: http://stackoverflow.com/questions/3151779/how-its-better-to-invoke-gdb-from- program-to-print-its-stacktrace –

4

Một cách khác có thể sử dụng thư viện Google Coredumper. Điều này tạo ra một kết quả tương tự với kỹ thuật fork + abort nhưng chơi đẹp hơn với các ứng dụng đa luồng (đình chỉ tất cả các luồng trong một thời gian ngắn trước khi forking để chúng không gây ra một sự lộn xộn trong trẻ).

Ví dụ:

 
    #include <google/coredumper.h> 
    ... 
    WriteCoreDump('core.myprogram'); 
    /* Keep going, we generated a core file, 
    * but we didn't crash. 
    */