導航:首頁 > 編程系統 > linuxdumpcore

linuxdumpcore

發布時間:2023-03-27 16:55:41

1. linux c內存溢出的core mp bug怎麼跟

淺析Linux下core文件
當我們的程序崩潰時,內核有可能把該程序當前內存映射到core文件里,方便程序員找到程序出現問題的地方。最常出 現的,幾乎所有C程序員都出現過的錯誤就是「段錯誤」了。也是最難查出問題原因的一個錯誤。下面我們就針對「段錯誤」來分析core文件的產生、以及我們 如何利用core文件找到出現崩潰的地方。
何謂core文件
當一個程序崩潰時,在進程當前工作目錄的core文件中復制了該進程的存儲圖像。core文件僅僅是一個內存映象(同時加上調試信息),主要是用來調試的。
當程序接收到以下UNIX信號會產生core文件:

名字

說明

ANSI C POSIX.1

SVR4 4.3+BSD

預設動作

SIGABRT

異常終止(abort)

. .

. .

終止w/core

SIGBUS

硬體故障

.

. .

終止w/core

SIGEMT

硬體故障

. .

終止w/core

SIGFPE

算術異常

. .

. .

終止w/core

SIGILL

非法硬體指令

. .

. .

終止w/core

SIGIOT

硬體故障

. .

終止w/core

SIGQUIT

終端退出符

.

. .

終止w/core

SIGSEGV

無效存儲訪問

. .

. .

終止w/core

SIGSYS

無效系統調用

. .

終止w/core

SIGTRAP

硬體故障

. .

終止w/core

SIGXCPU

超過CPU限制(setrlimit)

. .

終止w/core

SIGXFSZ

超過文件長度限制(setrlimit)

. .

終止w/core

在系統默認動作列,「終止w/core」表示在進程當前工作目錄的core文件中復制了該進程的存儲圖像(該文件名為core,由此可以看出這種功能很久之前就是UNIX功能的一部分)。大多數UNIX調試程序都使用core文件以檢查進程在終止時的狀態。
core文件的產生不是POSIX.1所屬部分,而是很多UNIX版本的實現特徵。UNIX第6版沒有檢查條件 (a)和(b),並且其源代碼中包含如下說明:「如果你正在找尋保護信號,那麼當設置-用戶-ID命令執行時,將可能產生大量的這種信號」。4.3 + BSD產生名為core.prog的文件,其中prog是被執行的程序名的前1 6個字元。它對core文件給予了某種標識,所以是一種改進特徵。
表中「硬體故障」對應於實現定義的硬體故障。這些名字中有很多取自UNIX早先在DP-11上的實現。請查看你所使用的系統的手冊,以確切地確定這些信號對應於哪些錯誤類型。
下面比較詳細地說明這些信號。
• SIGABRT 調用abort函數時產生此信號。進程異常終止。
• SIGBUS 指示一個實現定義的硬體故障。
• SIGEMT 指示一個實現定義的硬體故障。
EMT這一名字來自PDP-11的emulator trap 指令。
• SIGFPE 此信號表示一個算術運算異常,例如除以0,浮點溢出等。
• SIGILL 此信號指示進程已執行一條非法硬體指令。
4.3BSD由abort函數產生此信號。SIGABRT現在被用於此。
• SIGIOT 這指示一個實現定義的硬體故障。
IOT這個名字來自於PDP-11對於輸入/輸出TRAP(input/output TRAP)指令的縮寫。系統V的早期版本,由abort函數產生此信號。SIGABRT現在被用於此。
• SIGQUIT 當用戶在終端上按退出鍵(一般採用Ctrl-\)時,產生此信號,並送至前台進
程組中的所有進程。此信號不僅終止前台進程組(如SIGINT所做的那樣),同時產生一個core文件。
• SIGSEGV 指示進程進行了一次無效的存儲訪問。
名字SEGV表示「段違例(segmentation violation)」。
• SIGSYS 指示一個無效的系統調用。由於某種未知原因,進程執行了一條系統調用指令,
但其指示系統調用類型的參數卻是無效的。
• SIGTRAP 指示一個實現定義的硬體故障。
此信號名來自於PDP-11的TRAP指令。
• SIGXCPU SVR4和4.3+BSD支持資源限制的概念。如果進程超過了其軟C P U時間限制,則產生此信號。
• SIGXFSZ 如果進程超過了其軟文件長度限制,則SVR4和4.3+BSD產生此信號。
摘自《UNIX環境高級編程》第10章 信號。

使用core文件調試程序
看下面的例子:
/*core_mp_test.c*/
#include
const char *str = "test";
void core_test(){
str[1] = 'T';
}

int main(){
core_test();
return 0;
}
編譯:
gcc –g core_mp_test.c -o core_mp_test
如果需要調試程序的話,使用gcc編譯時加上-g選項,這樣調試core文件的時候比較容易找到錯誤的地方。
執行:
./core_mp_test
段錯誤
運行core_mp_test程序出現了「段錯誤」,但沒有產生core文件。這是因為系統默認core文件的大小為0,所以沒有創建。可以用ulimit命令查看和修改core文件的大小。
ulimit -c 0
ulimit -c 1000
ulimit -c 1000
-c 指定修改core文件的大小,1000指定了core文件大小。也可以對core文件的大小不做限制,如:
ulimit -c unlimited
ulimit -c unlimited
如果想讓修改永久生效,則需要修改配置文件,如 .bash_profile、/etc/profile或/etc/security/limits.conf。
再次執行:
./core_mp_test
段錯誤 (core mped)
ls core.*
core.6133
可以看到已經創建了一個core.6133的文件.6133是core_mp_test程序運行的進程ID。
調式core文件
core文件是個二進制文件,需要用相應的工具來分析程序崩潰時的內存映像。
file core.6133
core.6133: ELF 32-bit LSB core file Intel 80386, version 1 (SYSV), SVR4-style, from 'core_mp_test'
在Linux下可以用GDB來調試core文件。
gdb core_mp_test core.6133
GNU gdb Red Hat Linux (5.3post-0.20021129.18rh)
Copyright 2003 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show ing" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux-gnu"...
Core was generated by `./core_mp_test'.
Program terminated with signal 11, Segmentation fault.
Reading symbols from /lib/tls/libc.so.6...done.
Loaded symbols for /lib/tls/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
#0 0x080482fd in core_test () at core_mp_test.c:7
7 str[1] = 'T';
(gdb) where
#0 0x080482fd in core_test () at core_mp_test.c:7
#1 0x08048317 in main () at core_mp_test.c:12
#2 0x42015574 in __libc_start_main () from /lib/tls/libc.so.6
GDB中鍵入where,就會看到程序崩潰時堆棧信息(當前函數之前的所有已調用函數的列表(包括當前函數),gdb只顯示最近幾個),我們很容易找到我們的程序在最後崩潰的時候調用了core_mp_test.c 第7行的代碼,導致程序崩潰。注意:在編譯程序的時候要加入選項-g。您也可以試試其他命令,如fram、list等。更詳細的用法,請查閱GDB文檔。
core文件創建在什麼位置
在進程當前工作目錄的下創建。通常與程序在相同的路徑下。但如果程序中調用了chdir函數,則有可能改變了當前工 作目錄。這時core文件創建在chdir指定的路徑下。有好多程序崩潰了,我們卻找不到core文件放在什麼位置。和chdir函數就有關系。當然程序 崩潰了不一定都產生core文件。
什麼時候不產生core文件
在下列條件下不產生core文件:
( a )進程是設置-用戶-ID,而且當前用戶並非程序文件的所有者;
( b )進程是設置-組-ID,而且當前用戶並非該程序文件的組所有者;
( c )用戶沒有寫當前工作目錄的許可權;
( d )文件太大。core文件的許可權(假定該文件在此之前並不存在)通常是用戶讀/寫,組讀和其他讀。
利用GDB調試core文件,當遇到程序崩潰時我們不再束手無策。

2. Redhat Linux下如何生成core mp文件

在Redhat Linux系統中默認是不生成core mp文件的,這是因為在/etc/profile文件中有這灶碼做樣一行 ulimit -S -c 0 /dev/null 2&1 第一種方法是修改/etc/profile,把ulimit那一行改為 ulimit -S -c unlimited /dev/null 2&1 這樣設置後系統允許所有用隱衡戶生成沒有大小限模槐制的core mp文件。這樣做的優點是不需要重起系統,缺點是無法控制只讓某些用戶生成core mp文件。 * soft core 0 如果只想對某些用戶或用戶組打開core mp,可以加入 user soft core 0或@group soft core 0 注意如果通過修改/etc/security/limits.conf文件打開core mp,還需要注釋掉/etc/profile中的ulmit那一行 #ulimit -S -c 0 /dev/null 2&1 這樣修改的優點是可以針對特定用戶或特定組打開core mp文件,缺點是需要重起系統。

3. Redhat Linux下如何生成core mp文件

在Redhat Linux系統中默認是不生成core mp文件的,這是因為在/etc/profile文件中有這樣一行
ulimit -S -c 0 /dev/null 2&1
第一種方法是修改/etc/profile,把ulimit那一行改為
ulimit -S -c unlimited /dev/null 2&1
這樣設置後系統允許所有用戶生成沒有大小限制的core mp文件。這樣做的優點是不需要重起系統,缺點是無法控制只讓某些用戶生成core mp文件。
* soft core 0
如果只想對某些用戶或用戶組打開core mp,可以加入
user soft core 0或@group soft core 0
注意如果通過修改/etc/security/limits.conf文件打開core mp,還需要注釋掉/etc/profile中的ulmit那一行
#ulimit -S -c 0 /dev/null 2&1
這樣修改的優點是可以針對特定用戶或特定組打開core mp文件,缺點是需要重起系統。

4. RedHat Linux下如何生成core mp文件

在linux平台下,設置core mp文件生成的方法:
1 )如何生成 coremp 文件
登陸 LINUX 伺服器,任意位置鍵入
echo "ulimit -c 1024" >> /etc/profile
退出 LINUX 重新登陸 LINUX
鍵入 ulimit -c
如果顯示 1024 那麼說明 coremp 已經被開啟。
1024 限制產生的 core 文件的大小不能超過 1024kb,可以使用參數unlimited,取消該限制
ulimit -c unlimited
2 ) . core 文件的簡單介紹
在一個程序崩潰時,它一般會在指定目錄下生成一個 core 文件。 core 文件僅僅是一個內存映象 ( 同時加上調試信息 ) ,主要是用來調試的。
3 ) . 開啟或關閉 core 文件的生成
用以下命令來阻止系統生成 core 文件 :
ulimit -c 0
下面的命令可以檢查生成 core 文件的選項是否打開 :
ulimit -a
該命令將顯示所有的用戶定製,其中選項 -a 代表「 all 」。
也可以修改系統文件來調整 core 選項
在 /etc/profile 通常會有這樣一句話來禁止產生 core 文件,通常這種設置是合理的 :
# No core files by default
ulimit -S -c 0 > /dev/null 2>&1
但是在開發過程中有時為了調試問題,還是需要在特定的用戶環境下打開 core 文件產生的設置。
在用戶的 ~/.bash_profile 里加上 ulimit -c unlimited 來讓特定的用戶可以產生 core 文件。
如果 ulimit -c 0 則也是禁止產生 core 文件,而 ulimit -c 1024 則限制產生的 core 文件的大小不能超過 1024kb
4 ) . 設置 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" > 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 coremp into the filename 添加導致產生 core 的信號
%t - insert UNIX time that the coremp occurred into filename 添加 core 文件生成時的 unix 時間
%h - insert hostname where the coremp happened into filename 添加主機名
%e - insert coremping executable name into filename 添加命令名
6 ) . 一個小方法來測試產生 core 文件
直接輸入指令 :
kill -s SIGSEGV $$
發生coremp一般都是在進程收到某個信號的時候,Linux上現在大概有60多個信號,可以使用 kill -l 命令全部列出來。
針對特定的信號,應用程序可以寫對應的信號處理函數。如果不指定,則採取默認的處理方式, 默認處理是coremp的信號如下:

3)SIGQUIT 4)SIGILL 6)SIGABRT 8)SIGFPE 11)SIGSEGV 7)SIGBUS 31)SIGSYS
5)SIGTRAP 24)SIGXCPU 25)SIGXFSZ 29)SIGIOT

我們看到SIGSEGV在其中,一般數組越界或是訪問空指針都會產生這個信號。另外雖然默認是這樣的,但是你也可以寫自己的信號處理函數改變默認行為。
上述內容只是產生coremp的必要條件,而非充分條件。要產生core文件還依賴於程序運行的shell,可以通過ulimit -a命令查看

5. 請教關於suse linux配置core mp的問題

應該是差不多的拉,fc有yum 這幾天我在安裝fc6,但是出問題了,提示刷新率回超出范圍, 你可以都試試啊答,都說suse比其它版本的linux對硬體要求高些,還有他的3D桌面好像已經裝好了,還是安裝時很簡單,不清楚,我沒打開過,我的電腦是集成顯卡

6. LINUX core mp怎麼設置

ulimit -c 1000000
設置 core 文件大小限制為 1000000位元組。
系統默認的一般是0,也就是禁止導出 core 文件。

7. Linux Dump 內存

Tools:Memory Imaging - Forensics Wiki

創建了mp文件 core.2071

曾經,Linux提供了兩個虛擬設備 /dev/mem 和 /dev/kmem 用於mp內存,然而很多發行版基於安全因素沒有開啟。 /dev/mem 鏈接物理內存, /dev/kmem 映射整個虛擬內禪正存空間。
後來的Linux內核, /dev/kmem 不再使用。 /dev/mem 收到額外的限制,並且 /dev/mem 默認不開啟。斗襲中
這些設備文件可以被dd或其他文件管理工具打開。

內存Dump工空山具:

注意,不要在未知內存寫入數據,會導致系統崩潰。

8. 關閉linux core mp有什麼作用

將錯誤內存訪問的狀態記族肆錄下來,用來分析程序bug所在。
用gdb調晌配試可以列印 traceback,即內存方兆謹轎位錯誤的調用棧。

9. 如何查詢和修改Linux操作系統生成core mp文件的默認路徑

經過分析發現系統默認的core文件生成路徑是/var/logs,但/var/logs目錄並非系統自帶的,系統初始安裝默認自帶的是/var/log,最終導致該系統出現core mp後並沒能生成core文件,因此如何查詢和修改系統默認的core mp文件生產路徑呢?

方法如下:一. 查詢core mp文件路徑:

方法1: # cat /proc/sys/kerne怠琺糙貉孬股茬癱長凱l/core_pattern。

方法2: # /sbin/sysctl kernel.core_pattern二. 修改core mp文件路徑:

方法1:臨時修改/proc/sys/kernel/core_pattern文件,但/proc目錄本身是動態載入的,每次系統重啟都會重新載入,因此這種方法只能作為臨時修改。 /proc/sys/kernel/core_pattern 例:echo 『/var/log/%e.core.%p』 > /proc/sys/kernel/core_pattern

方法2:永久修改:使戚睜辯用sysctl -w name=value命令。 例:高缺/sbin/sysctl -w kernel.core_pattern=/var/log/%e.core.%p為了更詳盡的記錄core mp當時的系統狀態,可通過以下參數來豐富core文件的命早敬名: %% 單個%字元。

10. linux 下如何打開core mp文件開關

mp文件可以在程序crash時,方便我們查看程序crash的地方和上下文信息。在window下,要能生成mp文件,需要自己編寫相應的代碼。不過現在網上可以找到相應的代碼,只要把它下載後然後加到自己的工程中去,就可以了! 在linux下面就簡單的許多。只要打開相應的開關,linux會自動在程序crash時生成相應的core文件。這個文件和window下的mp文件類似。 下面是簡單的一些步驟: 1.查看當前是否已經打開了此開關 通過命令:ulimit -c 如果輸出為 0 ,則代表沒有打開。如果為unlimited則已經打開了,就沒必要在做打開。 2.通過命令打開 ulimit -c unlimited .然後通過步驟1,可以監測是否打開成功。 3.如果你要取消,很簡單:ulimit -c 0 就可以了 通過上面的命令修改後,一般都只是對當前會話起作用,當你下次重新登錄後,還是要重新輸入上面的命令,所以很麻煩。我們可以把通過修改 /etc/profile文件 來使系統每次自動打開。步驟如下: 1.首先打開/etc/profile文件 一般都可以在文件中找到 這句語句:ulimit -S -c 0 /dev/null 2&1.ok,根據上面的例子,我們只要把那個0 改為 unlimited 就ok了。然後保存退出。 2.通過source /etc/profile 使當期設置生效。 3.通過ulimit -c 查看下是否已經打開。 其實不光這個命令可以加入到/etc/profile文件中,一些其他我們需要每次登錄都生效的都可以加入到此文件中,因為登錄時linux都會載入此文件。比如一些環境變數的設置。 還有一種方法可以通過修改/etc/security/limits.conf文件來設置,這個方法沒有試過,也是網上看到。不過上面兩種就可以了! 最後說一下生成core mp文件的位置,默認位置與可執行程序在同一目錄下,文件名是core.***,其中***是一個數字。core mp文件名的模式保存在/proc/sys/kernel/core_pattern中,預設值是core。通過以下命令可以更改core mp文件的位置(如希望生成到/tmp/cores目錄下) echo 「/tmp/cores/core」 /proc/sys/kernel/core_pattern 設置完以後我們可以做個測試,寫個程序,產生一個異常。然後看到當前目錄會有個core*的文件。然後我們可以 gdb core。* 程序 進行調試。

閱讀全文

與linuxdumpcore相關的資料

熱點內容
maya粒子表達式教程 瀏覽:84
抖音小視頻如何掛app 瀏覽:283
cad怎麼設置替補文件 瀏覽:790
win10啟動文件是空的 瀏覽:397
jk網站有哪些 瀏覽:134
學編程和3d哪個更好 瀏覽:932
win10移動硬碟文件無法打開 瀏覽:385
文件名是亂碼還刪不掉 瀏覽:643
蘋果鍵盤怎麼打開任務管理器 瀏覽:437
手機桌面文件名字大全 瀏覽:334
tplink默認無線密碼是多少 瀏覽:33
ipaddgm文件 瀏覽:99
lua語言編程用哪個平台 瀏覽:272
政采雲如何導出pdf投標文件 瀏覽:529
php獲取postjson數據 瀏覽:551
javatimetask 瀏覽:16
編程的話要什麼證件 瀏覽:94
錢脈通微信多開 瀏覽:878
中學生學編程哪個培訓機構好 瀏覽:852
榮耀路由TV設置文件共享錯誤 瀏覽:525

友情鏈接