Core,又稱之為Core Dump文件,是/Linux操作系統的一種機制,對於線上服務而言,Core令人聞之色變,因為出Core的過程意味著服務暫時不能正常響應,需要恢復,並且隨著吐Core進程的內存空間越大,此過程可能持續很長一段時間(例如當進程佔用60G+以上內存時,完整Core文件需要15分鍾才能完全寫到磁碟上),這期間產生的流量損失,不可估量。
凡事皆有兩面性,OS在出Core的同時,雖然會終止掉當前進程,但是也會保留下第一手的現場數據,OS彷彿是一架被按下快門的相機,而照片就是產出的Core文件。裡面含有當進程被終止時內存、CPU寄存器等信息,可以供後續開發人員進行調試。
關於Core產生的原因很多,比如過去一些Unix的版本不支持現代Linux上這種GDB直接附著到進程上進行調試的機制,需要先向進程發送終止信號,然後用工具閱讀core文件。在Linux上,我們就可以使用kill向一個指定的進程發送信號或者使用gcore命令來使其主動出Core並退出。如果從淺層次的原因上來講,出Core意味著當前進程存在BUG,需要程序員修復。從深層次的原因上講,是當前進程觸犯了某些OS層級的保護機制,逼迫OS向當前進程發送諸如SIGSEGV(即signal 11)之類的信號, 例如訪問空指針或數組越界出Core,實際上是觸犯了OS的內存管理,訪問了非當前進程的內存空間,OS需要通過出Core來進行警示,這就好像一個人身體內存在病毒,免疫系統就會通過發熱來警示,並導致人體發燒是一個道理(有意思的是,並不是每次數組越界都會出Core,這和OS的內存管理中虛擬頁面分配大小和邊界有關,即使不出Core,也很有可能讀到臟數據,引起後續程序行為紊亂,這是一種很難追查的BUG)。
說了這些,似乎感覺Core很強勢,讓人感覺缺乏控制力,其實不然。控制Core產生的行為和方式,有兩個途徑:
1.修改/proc/sys/kernel/core_pattern文件,此文件用於控制Core文件產生的文件名,默認情況下,此文件內容只有一行內容:「core」,此文件支持定製,一般使用%配合不同的字元,這里羅列幾種:
%p 出Core進程的PID
%u 出Core進程的UID
%s 造成Core的signal號
%t 出Core的時間,從1970-01-0100:00:00開始的秒數
%e 出Core進程對應的可執行文件名
2.Ulimit –C命令,此命令可以顯示當前OS對於Core文件大小的限制,如果為0,則表示不允許產生Core文件。如果想進行修改,可以使用:
Ulimit –cn
其中n為數字,表示允許Core文件體積的最大值,單位為Kb,如果想設為無限大,可以執行:
Ulimit -cunlimited
產生了Core文件之後,就是如何查看Core文件,並確定問題所在,進行修復。為此,我們不妨先來看看Core文件的格式,多了解一些Core文件。
㈡ linux上的core文件,麻煩牛人們幫忙解釋下是什麼原因
關於UNIX/Linux系統來下面產生的core文件,根據我自使用系統的經驗,通常是由於自己在編寫程序的過程中,由於自己的疏忽,使自己編寫的程序產生了數組越界、或者是程序中的指針指向了一塊無效的內存區域,產生的內存溢出錯誤。這一點在C語言編程過程中尤為明顯,即:雖然定義了一個指針變數,但是未對該變數進行初始化、且判斷該指針是否為空指針,而在後面的程序中又使用到了該變數,這時候肯定就會產生內存溢出錯誤。通常產生的提示信息就是:Segmentfault,CoreDumped!此時再一看自己當前工作的目錄下面,就會自動產生出一個文件名為core的文件,通常該文件佔得空間也是比較大的,至少好幾兆位元組。
㈢ linux有多個core文件,怎麼區分它們屬於哪個進程
只在ubuntu上試過, 以例子說明
強制當前shell sigsegv core mp, 當前shell會退出
$kill -SIGSEGV $$
core file 已經產生
$/var/tmp/cores>ls
core
用gdb列出program name
$gdb
GNU gdb (GDB) 7.5-ubuntu
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show ing"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) core-file ./core
[New LWP 1808]
Core was generated by `/usr/local/bin/ksh'.
Program terminated with signal 11, Segmentation fault.
#0 0x00007f654584d707 in ?? ()
(gdb) quit
用知道的program名字來load core, 並列出stack
$gdb /usr/local/bin/ksh core
GNU gdb (GDB) 7.5-ubuntu
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show ing"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /usr/local/bin/ksh...(no debugging symbols found)...done.
[New LWP 1808]
warning: Can't read pathname for load map: Input/output error.
Core was generated by `/usr/local/bin/ksh'.
Program terminated with signal 11, Segmentation fault.
#0 0x00007f654584d707 in kill () at ../sysdeps/unix/syscall-template.S:82
82 ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) bt
#0 0x00007f654584d707 in kill () at ../sysdeps/unix/syscall-template.S:82
#1 0x000000000043244c in job_kill ()
#2 0x00000000004322ed in job_walk ()
#3 0x0000000000474ad9 in b_kill ()
#4 0x000000000045d871 in sh_exec ()
#5 0x0000000000412b16 in exfile ()
#6 0x00000000004135ea in sh_main ()
#7 0x0000000000411f7a in main ()
㈣ Linux 進程、線程和CPU的關系,cpu親和性
1、物理CPU數:機器主板上實際插入的cpu數量,比如說你的主板上安裝了一塊8核CPU,那麼物理CPU個數就是1個,所以物理CPU個數就是主板上安裝的CPU個數。
2、物理CPU核數:單個物理CPU上面有多個核,物理CPU核數=物理CPU數✖️單個物理CPU的核
3、邏輯CPU核數:一般情況,我們認為一顆CPU可以有多個核,加上intel的超線程技術(HT), 可以在邏輯上再分一倍數量的CPU core出來。邏輯CPU核數=物理CPU數✖️單個物理CPU的核*2
4、超線程技術(Hyper-Threading):就是利用特殊的硬體指令,把兩個邏輯CPU模擬成兩個物理CPU,實現多核多線程。我們常聽到的雙核四線程/四核八線程指的就是支持超線程技術的CPU。
1、並行:兩件(多件)事情在同一時刻一起發生。
2、並發:兩件(多件)事情在同一時刻只能有一個發生,由於CPU快速切換,從而給人的感覺是同時進行。
3、進程和線程
進程是資源分配的最小單位,一個程序有至少一個進程。線程是程序執行的最小單位。一個進程有至少一個線程。
線程之間的通信更方便,同一進程下的線程共享全局變數、靜態變數等數據,而進程之間的通信需要以通信的方式(IPC)進行。多進程程序更健壯,多線程程序只要有一個線程死掉,整個進程也死掉了,而一個進程死掉並不會對另外一個進程造成影響,因為進程有自己獨立的地址空間。
4、單核多線程:單核CPU上運行多線程, 同一時刻只有一個線程在跑,系統進行線程切換,系統給每個線程分配時間片來執行,看起來就像是同時在跑, 但實際上是每個線程跑一點點就換到其它線程繼續跑。
5、多核多線程:每個核上各自運行線程,同一時刻可以有多個線程同時在跑。
1、對於單核:多線程和多進程的多任務是在單cpu交替執行(時間片輪轉調度,優先順序調度等),屬於並發
2、對於多核:同一個時間多個進程運行在不同的CPU核上,或者是同一個時間多個線程能分布在不同的CPU核上(線程數小於內核數),屬於並行。
3、上下文切換:上下文切換指的是內核(操作系統的核心)在CPU上對進程或者線程進行切換。上下文切換過程中的信息被保存在進程式控制制塊(PCB-Process Control Block)中。PCB又被稱作切換幀(SwitchFrame)。上下文切換的信息會一直被保存在CPU的內存中,直到被再次使用。
CPU 親和性(affinity)就是進程要在某個給定的 CPU 上盡量長時間地運行而不被遷移到其他處理器的傾向性。這樣可以減少上下文切換的次數,提高程序運行性能。可分為:自然親和性和硬親和性
1、自然親和性:就是進程要在指定的 CPU 上盡量長時間地運行而不被遷移到其他處理器,Linux 內核進程調度器天生就具有被稱為 軟 CPU 親和性(affinity) 的特性,這意味著進程通常不會在處理器之間頻繁遷移。這種狀態正是我們希望的,因為進程遷移的頻率小就意味著產生的負載小。Linux調度器預設就支持自然CPU親和性(natural CPU affinity): 調度器會試圖保持進程在相同的CPU上運行。
2、硬親和性:簡單來說就是利用linux內核提供給用戶的API,強行將進程或者線程綁定到某一個指定的cpu核運行。Linux硬親和性指定API:taskset .
taskset [options] mask command [arg]...
taskset [options] -p [mask] pid
taskset 命令用於設置或者獲取一直指定的 PID 對於 CPU 核的運行依賴關系。也可以用 taskset 啟動一個命令,直接設置它的 CPU 核的運行依賴關系。
CPU 核依賴關系是指,命令會被在指定的 CPU 核中運行,而不會再其他 CPU 核中運行的一種調度關系。需要說明的是,在正常情況下,為了系統性能的原因,調度器會盡可能的在一個 CPU 核中維持一個進程的執行。強制指定特殊的 CPU 核依賴關系對於特殊的應用是有意義的
CPU 核的定義採用位定義的方式進行,最低位代表 CPU0,然後依次排序。這種位定義可以超過系統實際的 CPU 總數,並不會存在問題。通過命令獲得的這種 CPU 位標記,只會包含系統實際 CPU 的數目。如果設定的位標記少於系統 CPU 的實際數目,那麼命令會產生一個錯誤。當然這種給定的和獲取的位標記採用 16 進制標識。
0x00000001
代表 #0 CPU
0x00000003
代表 #0 和 #1 CPU
0xFFFFFFFF
代表 #0 到 #31 CPU
-p, --pid
對一個現有的進程進行操作,而不是啟動一個新的進程
-c, --cpu-list
使用 CPU 編號替代位標記,這可以是一個列表,列表中可以使用逗號分隔,或者使用 "-" 進行范圍標記,例如:0,5,7,9
-h, --help
列印幫助信息
-V, --version
列印版本信息
如果需要設定,那麼需要擁有 CAP_SYS_NICE 的許可權;如果要獲取設定信息,沒有任何許可權要求。
taskset 命令屬於 util-linux-ng 包,可以使用 yum 直接安裝。
㈤ linux的dev下的core可以刪除嗎
可以,Core文件其實就是內存的映像,當程序崩潰時,存儲內存的相應信息,主用用於對程序進行調試。當程序崩潰時便會產生core文件,其實准確的應該說是core mp 文件
㈥ 怎麼查看Linux的core開關,以及如何打開和關閉
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。* 程序 進行調試。
㈦ linux ls 顯示core.xxxx
core文件是程序崩潰時產生的,你可以用gdb來調試一下其中的內容。
你也可以禁止生成core,不過出現了異常情況最好還是查一下原因。
㈧ linux內核產生的core文件怎麼看
用gdb調試core文件