2010-04-23 25 views
6

Có cách nào để định cấu hình thư mục nơi tệp kết xuất lõi được đặt cho một quy trình cụ thể không?mỗi thư mục kết xuất lõi có thể định cấu hình được

Tôi có quy trình daemon được viết bằng C++ mà tôi muốn định cấu hình thư mục kết xuất lõi. Tùy chọn mẫu tên tệp cũng phải được định cấu hình.

Tôi biết về /proc/sys/kernel/core_pattern, tuy nhiên điều này sẽ thay đổi cấu trúc và cấu trúc thư mục trên toàn cầu.

Apache có chỉ thị CoreDumpDirectory - vì vậy dường như có thể.

Trả lời

14

Không, bạn không thể đặt cho mỗi quy trình. Tệp cốt lõi được chuyển vào thư mục làm việc hiện tại của tiến trình hoặc thư mục được đặt trong/proc/sys/kernel/core_pattern nếu mẫu có chứa một thư mục.

CoreDumpDirectory trong apache là một hack, apache đăng ký trình xử lý tín hiệu cho tất cả các tín hiệu gây ra kết xuất lõi và thay đổi thư mục hiện tại trong trình xử lý tín hiệu của nó.

/* handle all varieties of core dumping signals */ 
static void sig_coredump(int sig) 
{ 
    apr_filepath_set(ap_coredump_dir, pconf); 
    apr_signal(sig, SIG_DFL); 
#if AP_ENABLE_EXCEPTION_HOOK 
    run_fatal_exception_hook(sig); 
#endif 
    /* linuxthreads issue calling getpid() here: 
    * This comparison won't match if the crashing thread is 
    * some module's thread that runs in the parent process. 
    * The fallout, which is limited to linuxthreads: 
    * The special log message won't be written when such a 
    * thread in the parent causes the parent to crash. 
    */ 
    if (getpid() == parent_pid) { 
     ap_log_error(APLOG_MARK, APLOG_NOTICE, 
        0, ap_server_conf, 
        "seg fault or similar nasty error detected " 
        "in the parent process"); 
     /* XXX we can probably add some rudimentary cleanup code here, 
     * like getting rid of the pid file. If any additional bad stuff 
     * happens, we are protected from recursive errors taking down the 
     * system since this function is no longer the signal handler GLA 
     */ 
    } 
    kill(getpid(), sig); 
    /* At this point we've got sig blocked, because we're still inside 
    * the signal handler. When we leave the signal handler it will 
    * be unblocked, and we'll take the signal... and coredump or whatever 
    * is appropriate for this particular Unix. In addition the parent 
    * will see the real signal we received -- whereas if we called 
    * abort() here, the parent would only see SIGABRT. 
    */ 
} 
Các vấn đề liên quan