Linux環境中以daemon方式執行的程式生成core dump

鍾超發表於2012-06-30

Linux環境中以daemon方式執行的程式生成core dump

  • 作者:柳大·Poechant(鍾超)
  • 郵箱:zhongchao.ustc#gmail.com(# -> @)
  • 部落格:Blog.CSDN.net/Poechant
  • 日期:June 30th, 2012

1 精要

  1. /etc/profile中新增:
      ulimit -c unlimited > /dev/null 2?&1
    
  2. 修改/proc/sys/kernel/core_pattern檔案中的 core dump 檔案格式為絕對路徑,比如:
      /data/coredump/core-%e-%p-%t
    

    注意/proc/sys/kernel/core_pattern的修改方式是:

      poechant@dev:~$ su
      Password:
      root@dev:/# echo `/data/coredump/core-%e-%p-%t` > /proc/sys/kernel/core_pattern
    

2 詳解

一般在 CLI 上啟動的程式,如果設定:

ulimit -c unlimited

就可以在程式以外終止時生成 core dump 檔案。但是對於 daemon 方式執行的程式,其與 CLI 啟動的程式的主要區別是程式的執行環境,其中就包括 cwd(current working directory)。如果以相對路徑方式定義 core 檔案的格式,比如定義 /proc/sys/kernel/core_pattern 為:

core-%e-%p-%t

則一般來說,daemon 檔案的 cwd 就是/,你可以通過/proc/<your_program_pid>/cwd來檢視,一般都是連線到/目錄。而如果使用者對這個目錄沒有寫許可權,那麼就不會生成 core dump 檔案了。

最直接的解決的方法,是修改/proc/sys/kernel/core_pattern為絕對路徑:

/data/coredump/core-%e-%p-%t

並且保證這樣就基本 OK 了。你可以通過程式來測試一下。兩種簡單的方式是:

2.1 兩個測試小例子

2.1.1 W1S 方式 (While-1-Sleep)

編寫一個簡單的程式如下:

#include <unistd.h>
int main() {
    while (1) {
        sleep(1);
    }
    return 0;
}

編譯執行後使用如下命令讓程式生成 core dump 檔案:

kill -ABRT <program_pid>

-ABRT也可以用-6,都是表示abort訊號。或者利用 GDB:

gdb -p <program_pid>
(gdb) gcore <core_filename>
Saved corefile <core_filename>

也可以生成 core dump 檔案。

2.1.2 故意產生一個 segment fault

int main(void) {
    int* p = NULL;
    delete p;
}

編譯執行就會被終止生成 core dump 檔案。

以上兩種方式,core dump 檔案應該都是按照你設定的/proc/sys/kernel/core_pattern來生成的。

2.2 core_pattern 格式詳解

%%  A single % character
%p  PID of dumped process
%u  real UID of dumped process
%g  real GID of dumped process
%s  number of signal causing dump
%t  time of dump (seconds since 0:00h, 1 Jan 1970)
%h  hostname (same asnodenamereturned by uname(2))
%e  executable filename

2.3 core_uses_pid 作用

/proc/sys/kernel/core_pattern中未定義%p時,/proc/sys/kernel/core_uses_pid檔案中定義是否在 core dump 檔名後追加程式ID.PID

  echo 1 > /proc/sys/kernel/core_uses_pid   使得 core檔名後包含   .PID
  echo 0 > /proc/sys/kernel/core_uses_pid   使得core檔名後不包含 .PID

3 Reference

  1. http://blog.csdn.net/iterzebra/article/details/6205848

-

轉載請註明來自柳大·Poechant(鍾超)的CSDN部落格:Blog.CSDN.net/Poechant

-

相關文章