Core文件作用、設置及用法


http://blog.csdn.net/lanmolei814/article/details/45201693

======================================

1.Core文件簡介

Core文件其實就是內存的映像,當程序崩潰時,存儲內存的相應信息,主用用於對程序進行調試。當程序崩潰時便會產生core文件,其實准確的應該說是core dump 文件,默認生成位置與可執行程序位於同一目錄下,文件名為core.***,其中***是某一數字。

2.開啟或關閉Core文件的生成

關閉或阻止core文件生成:

$ulimit -c 0

打開core文件生成:

$ulimit -c unlimited

檢查core文件的選項是否打開:

$ulimit -a

ulimit參數含義如下: 

             -a     All current limits are reported
              -c     The maximum size of core files created
              -d     The maximum size of a process鈥檚 data segment
              -e     The maximum scheduling priority ("nice")
              -f     The maximum size of files written by the shell and its children
              -i     The maximum number of pending signals
              -l     The maximum size that may be locked into memory
              -m     The maximum resident set size (has no effect on Linux)
              -n     The maximum number of open file descriptors (most systems do not allow this value to be set)
              -p     The pipe size in 512-byte blocks (this may not be set)
              -q     The maximum number of bytes in POSIX message queues
              -r     The maximum real-time scheduling priority
              -s     The maximum stack size
              -t     The maximum amount of cpu time in seconds
              -u     The maximum number of processes available to a single user
              -v     The maximum amount of virtual memory available to the shell
              -x     The maximum number of file locks

 

以上配置只對當前會話起作用,下次重新登陸后,還是得重新配置。要想配置永久生效,得在/etc/profile或者/etc/security/limits.conf文件中進行配置。

首先以root權限登陸,然后打開/etc/security/limits.conf文件,進行配置:

#vim /etc/security/limits.conf

<domain>    <type>    <item>        <value>

       *              soft          core         unlimited

或者在/etc/profile中作如下配置:

#vim /etc/profile

ulimit -S -c unlimited >/dev/null 2>&1

或者想配置只針對某一用戶有效,則修改此用戶的~/.bashrc或者~/.bash_profile文件:

limit -c unlimited

ulimit -c 0 是禁止產生core文件,而ulimit -c 1024則限制產生的core文件的大小不能超過1024kb

3.設置Core Dump的核心轉儲文件目錄和命名規則

/proc/sys/kernel/core_uses_pid可以控制產生的core文件的文件名中是否添加pid作為擴展,如果添加則文件內容為1,否則為0
/proc/sys/kernel/core_pattern可以設置格式化的core文件保存位置或文件名,比如原來文件內容是core-%e
可以這樣修改:
echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
將會控制所產生的core文件會存放到/corefile目錄下,產生的文件名為core-命令名-pid-時間戳
以下是參數列表:
    %p - insert pid into filename 添加pid
    %u - insert current uid into filename 添加當前uid
    %g - insert current gid into filename 添加當前gid
    %s - insert signal that caused the coredump into the filename 添加導致產生core的信號
    %t - insert UNIX time that the coredump occurred into filename 添加core文件生成時的unix時間
    %h - insert hostname where the coredump happened into filename 添加主機名
    %e - insert coredumping executable name into filename 添加命令名

4.core文件的使用

在core文件所在目錄下鍵入:
gdb -c core   (-c指定core文件)
它會啟動GNU的調試器,來調試core文件,並且會顯示生成此core文件的程序名,中止此程序的信號等等
如果你已經知道是由什么程序生成此core文件的,比如MyServer崩潰了生成core.12345,那么用此指令調試:
gdb -c core MyServer

5. 一個小方法來測試產生core文件

直接輸入指令:
kill -s SIGSEGV $$
擴展:

ulimint -a 用來顯示當前的各種用戶進程限制
Linux對於每個用戶,系統限制其最大進程數,為提高性能,可以根據設備資源情況,
設置個Linux用戶的最大進程數,一些需要設置為無限制:
數據段長度:ulimit -d unlimited
最大內存大小:ulimit -m unlimited
堆棧大小:ulimit -s unlimited

我們在用這個命令的時候主要是為了產生core文件,就是程序運行發行段錯誤時的文件:

ulimit -c unlimited   

生成core文件,

#######################################################
以下來自;http://hi.baidu.com/jrckkyy/blog/item/2562320a5bdbc534b1351d95.html

查看限制情況 ulimit -a

可以看到如下信息

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
pending signals                 (-i) 1024
max locked memory       (kbytes, -l) 32
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

而我們需要修改的是open files (-n) 1024的值

於是命令就是limit -n 2048(隨各自需要設置)

-----------------------------------------------------------------------------------

 

功能說明:控制shell程序的資源。

語  法:ulimit [-aHS][-c <core文件上限>][-d <數據節區大小>][-f <文件大小>][-m <內存大小>][-n <文件數目>][-p <緩沖區大小>][-s <堆疊大小>][-t <CPU時間>][-u <程序數目>][-v <虛擬內存大小>]

補充說明:ulimit為shell內建指令,可用來控制shell執行程序的資源。

參  數:
   -a  顯示目前資源限制的設定。 
   -c <core文件上限>  設定core文件的最大值,單位為區塊。 
   -d <數據節區大小>  程序數據節區的最大值,單位為KB。 
   -f <文件大小>  shell所能建立的最大文件,單位為區塊。 
   -H  設定資源的硬性限制,也就是管理員所設下的限制。 
   -m <內存大小>  指定可使用內存的上限,單位為KB。 
   -n <文件數目>  指定同一時間最多可開啟的文件數。 
   -p <緩沖區大小>  指定管道緩沖區的大小,單位512字節。 
   -s <堆疊大小>  指定堆疊的上限,單位為KB。 
   -S  設定資源的彈性限制。 
   -t <CPU時間>  指定CPU使用時間的上限,單位為秒。 
   -u <程序數目>  用戶最多可開啟的程序數目。 
   -v <虛擬內存大小>  指定可使用的虛擬內存上限,單位為KB。

------------------

 

1,說明:
ulimit用於shell啟動進程所占用的資源.

2,類別:
shell內建命令

3,語法格式:
ulimit [-acdfHlmnpsStvw] [size]

4,參數介紹:

QUOTE:
-H 設置硬件資源限制.
-S 設置軟件資源限制.
-a 顯示當前所有的資源限制.
-c size:設置core文件的最大值.單位:blocks
-d size:設置數據段的最大值.單位:kbytes
-f size:設置創建文件的最大值.單位:blocks
-l size:設置在內存中鎖定進程的最大值.單位:kbytes
-m size:設置可以使用的常駐內存的最大值.單位:kbytes
-n size:設置內核可以同時打開的文件描述符的最大值.單位:n
-p size:設置管道緩沖區的最大值.單位:kbytes
-s size:設置堆棧的最大值.單位:kbytes
-t size:設置CPU使用時間的最大上限.單位:seconds
-v size:設置虛擬內存的最大值.單位:kbytes


5,簡單實例:

1]在RH8的環境文件/etc/profile中,我們可以看到系統是如何配置ulimit的:

CODE:
#grep ulimit /etc/profile 
ulimit -S -c 0 > /dev/null 2>&1


這條語句設置了對軟件資源和對core文件大小的設置

2]如果我們想要對由shell創建的文件大小作些限制,如:

CODE:
#ll h 
-rw-r--r-- 1 lee lee 150062 7月 22 02:39 h 
#ulimit -f 100 #設置創建文件的最大塊(一塊=512字節) 
#cat h>newh 
File size limit exceeded 
#ll newh 
-rw-r--r-- 1 lee lee 51200 11月 8 11:47 newh


文件h的大小是150062字節,而我們設定的創建文件的大小是512字節x100塊=51200字節
當然系統就會根據你的設置生成了51200字節的newh文件.

3]可以像實例1]一樣,把你要設置的ulimit放在/etc/profile這個環境文件中.

 

------------------------------------------------------------------------------------------------------------------

當系統中的一些程序在遇到一些錯誤以及crash時,系統會自動產生core文件記錄crash時刻系統信息,包括內存和寄存器信息,用以程序員日 后debug時可以使用。這些錯誤包括段錯誤、非法指令、總線錯誤或用戶自己生成的退出信息等等,一般地,core文件在當前文件夾中存放。

core文件有時可能在你發生錯誤時,並沒有出現在你當前的文件夾中,發生這種情況的原因有兩個:一個是當前終端被設置為不能彈出core文件;另一種則是core文件被指定了路徑。

對於前者,我們可以使用ulimit命令對core文件的大小進行設定。一般默認情況下,core文件的大小被設置為0,這樣系統就不dump出core文件了。這時,使用命令:ulimit -c unlimited進行設置,就可以把core文件的大小設置為無限大,同時也可以使用數字來替代unlimited,對core文件的上限制做更精確的設定。

除了可以設置core文件的大小之外,還可以對core文件的名稱進行一些規定。這種設置是對/proc/sys/kernel/core_pattern和/proc/sys/kernel/core_uses_pid這兩個文件進行修改。改動這兩個文件的方法如下:

echo <pattern> > /proc/sys/kernel/core_pattern

echo <"0"/"1"> /proc/sys/kernel/core_uses_pid

並且注意,只有超級用戶才可以修改這兩個表。

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中可以包含路徑信息。

------------------------------------------------------------------------------------------------------------------

下面的資料是從互聯網上整理的來的,參考文獻如下:

http://blog.csdn.NET/hanchaoman/archive/2009/08/03/4405655.aspx

http://www.mysys-admin.org/category/general/

 

 

1. 可以用ulimit -a 查看一下棧的大小。
在內核2.6.20下, stack size 為8192 kbytes
如果這里沒有限制,就棧的大小就只受內存的限制。2G是上限。

2. core 文件
    * 開啟或關閉core文件的生成
ulimit -c 可以查看是否打開此選項,若為0則為關閉;
ulimit -c 0可手動關閉
ulimit -c 1000 為設置core文件大小最大為1000k

ulimit -c unlimited 設置core文件大小為不限制大小

 

很多系統在默認的情況下是關閉生成core文件的,這個命令可以加到你的profile中去

3.設置Core Dump的核心轉儲文件目錄和命名規則

 

在默認的情況下,很多系統的core文件是生成在你運行程序的目錄下,或者你在程序中chdir后的那個目錄,然后在core文件的后面加了一個 pid。在實際工作中,這樣可能會造成很多目錄下產生core文件,不便於管理,實際上,在2.6下,core文件的生成位置和文件名的命名都是可以配置 的。

 

/proc/sys/kernel/core_uses_pid可以控制產生的core文件的文件名中是否添加pid作為擴展,如果添加則文件內容為1,否則為0
proc/sys/kernel/core_pattern可以設置格式化的core文件保存位置或文件名,比如原來文件內容是core-%e
可以這樣修改:
echo "/tmp/core-%e-%p" > core_pattern
將會控制所產生的core文件會存放到/corefile目錄下,產生的文件名為core-命令名-pid-時間戳
以下是參數列表:
    %p - insert pid into filename 添加pid
    %u - insert current uid into filename 添加當前uid
    %g - insert current gid into filename 添加當前gid
    %s - insert signal that caused the coredump into the filename 添加導致產生core的信號
    %t - insert UNIX time that the coredump occurred into filename 添加core文件生成時的unix時間
    %h - insert hostname where the coredump happened into filename 添加主機名
    %e - insert coredumping executable name into filename 添加命令名

當然,你可以用下列方式來完成
sysctl -w kernel.core_pattern=/tmp/core-%e-%p

 

這些操作一旦計算機重啟,則會丟失,如果你想持久化這些操作,可以在 /etc/sysctl.conf文件中增加:
kernel.core_pattern=/tmp/core%p

 

加好后,如果你想不重啟看看效果的話,則用下面的命令:
sysctl -p /etc/sysctl.conf

------------------------------------------------------------------------------------------------------------------

高手指教:

    解決的問題:
         現有一程序P 長期在服務器上運行,目前經常是每1天死掉一次(段錯誤)。

    目前解決方法:
         用SecureCRT開一個終端,並在服務其上設置ulimit -c nulimited,然后啟動程序P。用ulimite -a 命令查詢結果如下:

         core file size       (blocks, -c) unlimited
         data seg size           (kbytes, -d) unlimited
         file size             (blocks, -f) unlimited
         pending signals                 (-i) 1024
         max locked memory    (kbytes, -l) 32
          ............
         表明core文件可以生成。

         並測試利用kill -6 pid能夠core文件。

   目前的困難:

         當運行ulimit -c nulimited終端 (並且該終端將程序P啟動到后台了 ./P &)關閉,程序P死掉后並沒有生成 core文件。
         經試驗后發現ulimit 命令與終端有關。

   高手指教:
          如何設置能夠生成core 文件,與終端無關
          即,程序啟動,關閉終端,當程序死掉(段錯誤)后能夠生成core文件。


/etc/security/limits.conf (中設置 redhat衍生系linux)

/etc/profile中的:
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1

注釋掉上面一行。

還有其他UNIX類操作系統也有自己的配置文件可以設置。

------------------------------------------------------------------------------------------------------------------

gdb core 多線程
在linux環境下調試多線程,總覺得不像.NET那么方便。這幾天就為找一個死鎖的bug折騰好久,介紹一下用過的方法吧。 

多線程如果dump,多為段錯誤,一般都涉及內存非法讀寫。可以這樣處理,使用下面的命令打開系統開關,讓其可以在死掉的時候生成core文件。    
ulimit -c unlimited 
這樣的話死掉的時候就可以在當前目錄看到core.pid(pid為進程號)的文件。接着使用gdb: 
gdb ./bin ./core.pid  
進去后,使用bt查看死掉時棧的情況,在使用frame命令。 

還有就是里面某個線程停住,也沒死,這種情況一般就是死鎖或者涉及消息接受的超時問題(聽人說的,沒有遇到過)。遇到這種情況,可以使用: 
gcore pid (調試進程的pid號) 
手動生成core文件,在使用pstack(linux下好像不好使)查看堆棧的情況。如果都看不出來,就仔細查看代碼,看看是不是在 if,return,break,continue這種語句操作是忘記解鎖,還有嵌套鎖的問題,都需要分析清楚了。 

最后,說一句,靜心看代碼,捶胸頓足是沒有用的。 

------------------------------------- 

1,說明: 
ulimit用於shell啟動進程所占用的資源. 
2,類別: 
shell內建命令 
3,語法格式: 
ulimit [-acdfHlmnpsStvw] [size] 
4,參數介紹: 
-H 設置硬件資源限制. 
-S 設置軟件資源限制. 
-a 顯示當前所有的資源限制. 
-c size:設置core文件的最大值.單位:blocks 
-d size:設置數據段的最大值.單位:kbytes 
-f size:設置創建文件的最大值.單位:blocks 
-l size:設置在內存中鎖定進程的最大值.單位:kbytes 
-m size:設置可以使用的常駐內存的最大值.單位:kbytes 
-n size:設置內核可以同時打開的文件描述符的最大值.單位:n 
-p size:設置管道緩沖區的最大值.單位:kbytes 
-s size:設置堆棧的最大值.單位:kbytes 
-t size:設置CPU使用時間的最大上限.單位:seconds 
-v size:設置虛擬內存的最大值.單位:kbytes 5,簡單實例:  
5.舉例 
在Linux下寫程序的時候,如果程序比較大,經常會遇到“段錯誤”(segmentation fault)這樣的問題,這主要就是由於Linux系統初始的堆棧大小(stack size)太小的緣故,一般為10M。我一般把stack size設置成256M,這樣就沒有段錯誤了!命令為: 
ulimit   -s 262140  
如果要系統自動記住這個配置,就編輯/etc/profile文件,在 “ulimit -S -c 0 > /dev/null 2>&1”行下,添加“ulimit   -s 262140”,保存重啟系統就可以了!  
1]在RH8的環境文件/etc/profile中,我們可以看到系統是如何配置ulimit的: 
#grep ulimit /etc/profile 
ulimit -S -c 0 > /dev/null 2>&1 
這條語句設置了對軟件資源和對core文件大小的設置 
2]如果我們想要對由shell創建的文件大小作些限制,如: 
#ll h 
-rw-r--r-- 1 lee lee 150062 7月 22 02:39 h 
#ulimit -f 100 #設置創建文件的最大塊(一塊=512字節) 
#cat h>newh 
File size limit exceeded 
#ll newh 
-rw-r--r-- 1 lee lee 51200 11月 8 11:47 newh 
文件h的大小是150062字節,而我們設定的創建文件的大小是512字節x100塊=51200字節 
當然系統就會根據你的設置生成了51200字節的newh文件. 
3]可以像實例1]一樣,把你要設置的ulimit放在/etc/profile這個環境文件中. 
用途  
設置或報告用戶資源極限。 
語法  
ulimit [ -H ] [ -S ] [ -a ] [ -c ] [ -d ] [ -f ] [ -m ] [ -n ] [ -s ] [ -t ] [ Limit ] 
描述  
ulimit 命令設置或報告用戶進程資源極限,如 /etc/security/limits 文件所定義。文件包含以下缺省值極限:  
fsize = 2097151 
core = 2097151 
cpu = -1 
data = 262144 
rss = 65536 
stack = 65536 
nofiles = 2000  
當新用戶添加到系統中時,這些值被作為缺省值使用。當向系統中添加用戶時,以上值通過 mkuser 命令設置,或通過 chuser 命令更改。  
極限分為軟性或硬性。通過 ulimit 命令,用戶可將軟極限更改到硬極限的最大設置值。要更改資源硬極限,必須擁有 root 用戶權限。  
很多系統不包括以上一種或數種極限。 特定資源的極限在指定 Limit 參數時設定。Limit 參數的值可以是每個資源中指定單元中的數字,或者為值 unlimited。要將特定的 ulimit 設置為 unlimited,可使用詞 unlimited。  
    注:在 /etc/security/limits 文件中設置缺省極限就是設置了系統寬度極限, 而不僅僅是創建用戶時用戶所需的極限。  
省略 Limit 參數時,將會打印出當前資源極限。除非用戶指定 -H 標志,否則打印出軟極限。當用戶指定一個以上資源時,極限名稱和單元在值之前打印。如果未給予選項,則假定帶有了 -f 標志。  
由於 ulimit 命令影響當前 shell 環境,所以它將作為 shell 常規內置命令提供。如果在獨立的命令執行環境中調用該命令,則不影響調用者環境的文件大小極限。以下示例中正是這種情況:  
nohup ulimit -f 10000 
env ulimit 10000  
一旦通過進程減少了硬極限,若無 root 特權則無法增加,即使返回到原值也不可能。  
關於用戶和系統資源極限的更多信息,請參見 AIX 5L Version 5.3 Technical Reference: Base Operating System and Extensions Volume 1 中的 getrlimit、setrlimit 或 vlimit 子例程。 
標志 
-a     列出所有當前資源極限。 
-c     以 512 字節塊為單位,指定核心轉儲的大小。 
-d     以 K 字節為單位指定數據區域的大小。 
-f     使用 Limit 參數時設定文件大小極限(以塊計),或者在未指定參數時報告文件大小極限。缺省值為 -f 標志。 
-H     指定設置某個給定資源的硬極限。如果用戶擁有 root 用戶權限,可以增大硬極限。任何用戶均可減少硬極限。 
-m     以 K 字節為單位指定物理存儲器的大小。 
-n     指定一個進程可以擁有的文件描述符的數量的極限。 
-s     以 K 字節為單位指定堆棧的大小。 
-S     指定為給定的資源設置軟極限。軟極限可增大到硬極限的值。如果 -H 和 -S 標志均未指定,極限適用於以上二者。 
-t     指定每個進程所使用的秒數。 
退出狀態  
返回以下退出值: 
0     成功完成。 
>0     拒絕對更高的極限的請求,或發生錯誤。 
示例  
要將文件大小極限設置為 51,200 字節,輸入:  
ulimit -f 100 




什么是Core Dump?

Core的意思是內存, Dump的意思是扔出來, 堆出來.

開發和使用Unix程序時, 有時程序莫名其妙的down了, 卻沒有任何的提示(有時候會提示core dumped). 這時候可以查看一下有沒有形如core.進程號的文件生成, 這個文件便是操作系統把程序down掉時的內存內容扔出來生成的, 它可以做為調試程序的參考.

core dump又叫核心轉儲, 當程序運行過程中發生異常, 程序異常退出時, 由操作系統把程序當前的內存狀況存儲在一個core文件中, 叫core dump.

如何使用core文件?

gdb -c core文件路徑 [應用程序的路徑]

進去后輸入where回車, 就可以顯示程序在哪一行當掉的, 在哪個函數中.

為什么沒有core文件生成呢?

有時候程序down了, 但是core文件卻沒有生成. core文件的生成跟你當前系統的環境設置有關系, 可以用下面的語句設置一下, 然后再運行程序便成生成core文件.

ulimit -c unlimited

core文件生成的位置一般於運行程序的路徑相同, 文件名一般為core.進程號

4. 用gdb查看core文件:

下面我們可以在發生運行時信號引起的錯誤時發生core dump了.

發生core dump之后, 用gdb進行查看core文件的內容, 以定位文件中引發core dump的行.

gdb [exec file] [core file]

如:

gdb ./test test.core

在進入gdb后, 用bt命令查看backtrace以檢查發生程序運行到哪里, 來定位core dump的文件->行。

 

何謂 core? 
       在使用半導體作為內存的材料前,人類是利用線圈當作內存的材料(發明 者為王安),線圈就叫作 core ,用線圈做的內存就叫作 core memory。如今 ,半導體工業澎勃發展,已經沒有人用 core memory 了,不過,在許多情況下, 人們還是把記憶體叫作 core 。 
        何謂 core dump? 
        我們在開發(或使用)一個程序時,最怕的就是程序莫明其妙地當掉。雖然系 統沒事,但我們下次仍可能遇到相同的問題。於是這時操作系統就會把程序當掉 時的內存內容 dump 出來(現在通常是寫在一個叫 core 的 file 里面),讓 我們或是 debugger 做為參考。這個動作就叫作 core dump。 
       為何會發生 core dump? 
       前面說過,在程序當掉時出錯。在 C/C++語言中,最常發生錯誤的地方就是指 針有問題。您可以利用 core 文件和 debugger 把錯誤找出來(要怎麽在 debugger 中使用 core 文件?man 一下 gdb 吧!)。
       如何用gdb調用core?

當c編寫的程序出現core是,可以用gdb programname core,查看core。如果找不到core文件,可以用一下命令查看和修改。

ulimit -a  //查看core文件的大小

ulimit -c  //修改core文件的大小

如果gdb -c core 時遇到一下情況:

#0 0x08048373 in ?? ()

#1 0xbfffd8f8 in ?? ()

#2 0x0804839e in ?? ()

#3 0xb74cc6b3 in ?? ()

#4 0x00000000 in ?? ()

請用以下方法解決:gdb ./a.out core 然后bt就可以了。

除了bt以外還有如下命令:where, frame, up, down, print可以使用。



【Cygwin下如何產生core文件】

在cygwin下,程序core dump,卻只生成一個*.stackdump 文件,為了能生成core dump文件,需要設置環境變量

export CYGWIN="$CYGWIN error_start=dumper.exe -d %1 %2"

 

程序core dump之后,總是停在"starting debuger pid XXX, tid XXX"上不動,一直以為環境變量設置有問題,在網絡上找了很久,沒有任何解決辦法,后來找個新版本替換dumper.exe文件,結果一替換就好了(http://cygwin.internet.bs/release/cygwin/cygwin-1.5.25-15.tar.bz2 ,下載這個安裝包,拷貝里面的dumper.exe) 。



http://stackoverflow.com/questions/320001/using-a-stackdump-from-cygwin-executable

上面鏈接中也給出了解決的方案:

 

A core file is a memory image of a crashed process. With a debugger you can find out the possible causes of the crash. If you don't know what to do with a core file (except rm core), you can request not to generate them with limit coredumpsize 0.

A segmentation fault is one of the manifestations of a process crash. Usually it arises when the program tries to access memory that it shouldn't.

There are amny causes of segmentation fault. here is a non-exhaustive list:

  • access to data through an uninitialized pointer
  • access to malloc'ed memory which has been free'd
  • access to array elements beyond the array size
  • ...

Tools exist for detecting such memory bad access. purify or lint are example of these.

You can instruct Cygwin to start your gdb debugger just in time when an fault occurs. To achieve this, adderror_start=action to the Cygwin environment variable:
export CYGWIN="$CYGWIN error_start=gdb -nw %1 %2"

Else you can have Cygwin generate a real core dump.

export CYGWIN="$CYGWIN error_start=dumper -d %1 %2"

 

Firstly, make sure you build with source debugging enabled (the using -g option):

gcc -g -o myfile myfile.c

Then Load the dump into gdb after the crash (or insight, or ddd)

gdb myfile core


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM