例如 <code>g++ -g test.cpp</code>
<code>ulimit -a</code>
<code>ulimit -c unlimited</code>
unlimited表示無大小限制,也可以指定具體的大小
<code>ulimit -c 1000</code>
表示檔案大小限制為1000Kb
若要全局生效需要在<code>/etc/profile</code>中加入上面的指令<code>ulimit -c 1000</code>,然後<code>source /etc/profile</code>使之生效
<code>/proc/sys/kernel/core_uses_pid</code>
檔案内容為1表示dump檔案以pid為擴充名
<code>/proc/sys/kernel/core_pattern</code>
core_pattern接受的是core檔案名稱的pattern,它包含任何字元串,并且用%作為轉移符号生成一些标示符,為core檔案名稱加入特殊含義。已定義的标示符有如下這些:
%%:相當于%
%p:相當于pid
%u:相當于uid
%g:相當于gid
%s:相當于導緻dump的信号的數字
%t:相當于dump的時間
%e:相當于執行檔案的名稱
%h:相當于hostname
除以上這些标志位外,還規定:
1、末尾的單個%可以直接去除;
2、%加上除上述以外的任何字元,%和該字元都會被去除;
3、所有其他字元都作為一般字元加入名稱中;
4、core檔案的名稱最大值為64個位元組(包括’\0’);
5、core_pattern中預設的pattern為core;
6、為了保持相容性,通過設定core_uses_pid,可以在core檔案的末尾加上%p;
7、pattern中可以包含路徑資訊。
echo “/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern
将會控制所産生的core檔案會存放到/corefile目錄下(/corefile目錄需要提前建立),産生的檔案名為core-執行檔案名-pid-時間戳
在發生SIGSEGV時系統會自動在程式目錄下生成core.xxxx檔案,此即dump檔案;
注意,此時程式不能再注冊SIGSEGV的處理函數!
使用gdb分析dump檔案:
1.執行gdb:gdb –core=core.xxxx
2.在gdb中加載符号檔案:file ./a.out
上兩步也可以統一成:gdb a.out core.xxxx
3.定位到出錯代碼:where或backtrace,将顯示#x這樣的堆棧資訊
4.檢視更詳細的函數調用資訊:frame x,x為#後的數字
作者:柒月