2014-05-06 13 views
5

tôi có một câu hỏi: tồn tại bất kỳ cuộc gọi hệ thống nào để tạo ra kết xuất lõi?Gọi hệ thống cho một bãi chứa lõi?

tôi biết được một bãi chứa lõi có thể được tạo ra bởi một tín hiệu, nhưng tôi muốn biết nếu nó có thể được tạo ra từ cuộc gọi hệ thống

+1

Từ đây: http://stackoverflow.com/questions/318647/what-is-a-good-way-to-dump-a-linux-core-file-from-inside-a-process. Đây không phải là cuộc gọi hệ thống mà là một thư viện 'google-coredumper' http://code.google.com/p/google-coredumper. –

Trả lời

4
void createdump(void) 
{ 
    if(!fork()) { //child process 
     // Crash the app 
     abort() || (*((void*)0) = 42); 
    } 
} 

gì bao giờ đặt bạn wan't để đổ gọi hàm. Điều này sẽ tạo ra một đứa trẻ và sụp đổ nó. Vì vậy, bạn có thể thoát khỏi ngay cả khi không thoát khỏi chương trình

+0

Tôi vừa viết bình luận bao gồm '((int *) 0) [0] = 42;' ... :-) – cmaster

+2

tại sao không chỉ 'abort()' trong phần tử con? Nếu nó không tạo ra một bãi chứa, có lẽ đó là vì 'ulimit' đang ngăn chặn nó, và sau đó' SIGSEGV' sẽ không tạo ra một bãi chứa. Bên cạnh đó, ngay cả khi 'abort()' không tạo ra một kết xuất, nó cũng sẽ không trả lại. Vì vậy, OR và biểu thức thứ hai có vẻ vô dụng. Tui bỏ lỡ điều gì vậy? –

+0

@cmaster: Bạn có thể mất một số dấu ngoặc đơn với '0 [(int *) 0]' –

1

Bạn cũng có thể tăng tín hiệu SIGABRT để có được kết xuất lõi.

tăng (SIGABRT);

* điều này tương đương với gọi hủy bỏ() trực tiếp.

1

Cùng ý tưởng như code hacker's answer, nhưng biên dịch được, với xử lý lỗi, và nếu không có sự zombie:

#include <unistd.h> 
#include <errno.h> 
#include <stdlib.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

int 
coredump(void) 
{ 
    pid_t p,r; 
    if(0>(p=fork())) 
     return -1; 
    if(0==p) 
     abort() /*child*/; 
    /*reap zombie*/ 
    do r=waitpid(p,0,0); while(0>r && EINTR==errno); 
    if(0>r) { 
     perror("waitpid shouldn't have failed"); 
     abort(); 
    } 
    return 0; 
} 

này vẫn có sự thiếu hụt khá rõ ràng ở chỗ là nó sẽ không làm việc với quá trình đa luồng.

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