2010-04-23 14 views
6

Czy istnieje sposób skonfigurowania katalogu, w którym znajdują się pliki zrzutu pamięci dla określonego procesu?dla katalogu konfiguracji zrzutu z możliwością konfiguracji procesu

Mam proces demona napisany w C++, dla którego chciałbym skonfigurować katalog zrzutu pamięci. Opcjonalnie wzorzec nazwy pliku powinien być również konfigurowalny.

Wiem o /proc/sys/kernel/core_pattern, ale to zmieniłoby strukturę i strukturę katalogów globalnie.

Apache ma dyrektywę CoreDumpDirectory - więc wydaje się to możliwe.

Odpowiedz

14

Nie, nie można ustawić na proces. Główny plik zostanie zrzucony do bieżącego katalogu roboczego procesu lub katalogu ustawionego w/proc/sys/kernel/core_pattern, jeśli wzorzec zawiera katalog.

CoreDumpDirectory w apache jest hack, apache rejestruje programy obsługi sygnałów dla wszystkich sygnałów, które powodują zrzut rdzenia, i zmienia bieżący katalog w swojej procedurze obsługi sygnału.

/* 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. 
    */ 
} 
Powiązane problemy