2010-02-01 17 views
8

Tôi biết cách tạo một kết xuất lõi trên OS X khi một quá trình bị treo, nhưng những gì tôi thực sự cần làm là gắn vào một tiến trình, tạo ra một kết xuất lõi, sau đó tiếp tục quá trình đó (không giết nó).OS X: Tạo phân đoạn lõi mà không cần gỡ bỏ quá trình?

Một thời gian dài trước đây (có thể một năm rưỡi trước) Tôi đã có mã C sẽ thực hiện việc này ... Nó sử dụng thư viện hạt nhân OS X để kết nối với một quy trình, đọc tất cả trạng thái luồng và bộ nhớ, và viết nó vào một tập tin Mach-O trên đĩa. Điều này làm việc tuyệt vời (và nó chính xác những gì tôi đang tìm kiếm), nhưng bây giờ tôi dường như không thể tìm thấy mã đó cho cuộc sống của tôi. Tôi dường như nhớ lại rằng mã có liên quan phần nào với cuốn sách nội bộ hệ thống OS X, nhưng đó chỉ là một hồi ức mơ hồ.

Có ai biết mã tôi đang nói đến và có thể chỉ cho tôi ở đó không? Nếu không ai biết một cách tốt để làm điều này tốt hơn với một số mã ví dụ?

Chỉnh sửa: Đây là câu trả lời.

Thông tin: http://osxbook.com/book/bonus/chapter8/core/

Chương trình sẽ làm điều đó cho bạn: http://osxbook.com/book/bonus/chapter8/core/download/gcore-1.3.tar.gz

Trả lời

6

Tôi tin rằng bạn đang tìm kiếm this information

Cụ thể:

/* UNIX Third Edition, circa early 1973 */ 
/* ken/sig.c */ 

core() 
{ 
int s, *ip; 
extern schar; 

/* u is the user area */ 
u.u_error = 0;   /* reset error code to "no error" */ 
u.u_dirp = "core";  /* file name to search for */ 
ip = namei(&schar, 1); /* do search; schar means it's a kernel string */ 

if (ip == NULL) {  /* failed to find */ 
    if (u.u_error)  /* because of some error */ 
     return(0);  /* so bail out */ 
    ip = maknode(0666); /* didn't exist; so create it */ 
} 

if (!access(ip, IWRITE)) { /* check "write" permission; 0 means OK */ 
    itrunc(ip);   /* truncate the core file */ 

    /* first we write the user area */ 
    u.u_offset[0] = 0;  /* offset for I/O */ 
    u.u_offset[1] = 0;  /* offset for I/O */ 
    u.u_base = &u;   /* base address for I/O (user area itself) */ 
    u.u_count = USIZE*64; /* bytes remaining for I/O; USIZE=8 */ 
    u.u_segflg = 1;  /* specify kernel address space */ 
    writei(ip);   /* do the write */ 

    /* 
    * u_procp points to the process structure 
    * p_size is the size of the process's swappable image (x 64 bytes) */ 
    */ 
    s = u.u_procp->p_size - USIZE; /* compute size left to write */ 

    /* 
    * This sets up software prototype segmentation registers to implement 
    * text(=0 here), data(=s here), and stack(=0 here) sizes specified. 
    */ 
    estabur(0, s, 0); 

    u.u_base = 0;   /* base address for I/O (start of space) */ 
    u.u_count = s*64;  /* s is in units of 64 bytes, so adjust */ 
    u.u_segflg = 0;  /* specify user address space */ 
    writei(ip);   /* do the write */ 
} 
iput(ip);     /* decrement inode reference count */ 
return(u.u_error==0);  /* done */ 
} 
+0

Đoạn mã trên là những gì anh ấy so sánh mã trong gzip được liên kết đến, do đó, điều đó không đúng, nhưng liên kết (và cụ thể là gzip gzip) là chính xác ly những gì tôi đang tìm kiếm. Cảm ơn! – LCC

+0

Điều đó sẽ dạy tôi sao chép và dán cẩn thận hơn – mbarnett

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