2011-03-11 31 views
2

當我的程序收到SIGSEGV信號時,如何轉儲內核? (運行我的程序的服務器的權限非常有限,因此默認禁用核心轉儲。)轉儲核心如果SIGSEGV(在C)?

我已經使用gcore編寫了以下內容,但我想使用C函數。我能不知何故抓住核心並將它寫入某個文件夾?


void segfaulthandler(int parameter) 
{ 
    char gcore[50]; 
    sprintf(gcore, "gcore -s -c \"core\" %u", getpid()); 
    system(gcore); 

    exit(1); 
} 

int main(void) 
{ 
    signal(SIGSEGV, segfaulthandler); 
} 

回答

1

在Linux上,你通常可以這樣做:

 
$ ulimit -c unlimited 

上接收到信號時產生的核心文件將被寫入過程中的當前工作目錄。

+0

核心文件將根據當前工作目錄創建,使用'/ proc/sys/kernel/core_pattern'的值 - 默認爲「core」 – Erik

+0

另外,'/ proc/sys/kernel/core_uses_pid '可以設置爲1,在這種情況下.pid被附加到核心文件名稱(除非模式包含%p) – Erik

3

除非有嚴格的限制,否則可以使用setrlimit(RLIMIT_CORE, ...)來增加軟限制並啓用coredumps - 這對應於在shell中運行ulimit -c