Linux環境中以daemon方式執行的程式生成core dump
Linux環境中以daemon方式執行的程式生成core dump
- 作者:柳大·Poechant(鍾超)
- 郵箱:zhongchao.ustc#gmail.com(# -> @)
- 部落格:Blog.CSDN.net/Poechant
- 日期:June 30th, 2012
1 精要
- 在
/etc/profile
中新增:ulimit -c unlimited > /dev/null 2?&1
- 修改
/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 as ’nodename’ returned 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
- http://blog.csdn.net/iterzebra/article/details/6205848
-
轉載請註明來自柳大·Poechant(鍾超)的CSDN部落格:Blog.CSDN.net/Poechant
-
相關文章
- vc++生成程式不需要.net執行環境的可以執行exe程式的方法C++
- Linux環境的PHP執行LinuxPHP
- linux執行環境&命令Linux
- linux 建立體積小的桌面環境以執行微信和WPSLinux
- windbg分析執行在64位環境下的32位程式的dump
- Linux 應用程式處理當前執行環境的環境變數(轉)Linux變數
- Linux Core DumpLinux
- 將 Java 程式作為 Linux 的 Daemon 程式以及防止程式多次執行 (轉)JavaLinux
- Linux執行環境大雜配Linux
- Linux/Go環境搭建, HelloWorld執行LinuxGo
- linux登入bash shell環境執行環境變數Linux變數
- 利用Salamander .Net Linker生成可脫離.net framework環境執行的程式Framework
- Linux core dump使用Linux
- 利用statspack來獲取生成環境中top SQL及其執行計劃SQL
- 如何在互動式環境中執行Python程式Python
- nodejs中REPL執行環境解析NodeJS
- 容器中的 .net core應用,生成dump檔案並匯出
- 大資料執行環境的執行大資料
- Apache Thrift 配置環境和執行(Linux)ApacheLinux
- linux或者CentOS環境下安裝.NET Core環境LinuxCentOS
- 在Grammarly的生產環境中執行LispLisp
- 解決非小程式執行環境,不能呼叫wx.login()生成code
- Linux 環境多執行緒程式設計基礎設施Linux執行緒程式設計
- Linux環境多執行緒程式設計基礎設施Linux執行緒程式設計
- linux搭建tomcat,mysql,jdk執行環境LinuxTomcatMySqlJDK
- linux下安裝jre執行環境Linux
- 配置Linux+Nginx+PHP+MySQL執行環境LinuxNginxPHPMySql
- 在Linux環境下執行DOS命令(轉)Linux
- Linux執行環境安裝全解(轉)Linux
- JavaScript執行環境與執行棧JavaScript
- 分散式的環境中id生成策略分散式
- 後臺執行緒(daemon)執行緒
- Java執行環境配置Java
- Linux環境下部署完JDK後執行一個簡單的Java程式LinuxJDKJava
- 釋出ASP.NET Core程式到Linux生產環境ASP.NETLinux
- 容器程式Core Dump處理
- 純終端Linux環境或者無掛載顯示卡Linux環境執行Chrome例項LinuxChrome
- Docker容器中執行.Net Core應用程式Docker