㈠ linux core 文件 怎麼分析
Core文件,也稱為Core Dump文件,是Unix/Linux操作系統中的一種機制。對於線上服務而言,Core文件的產生往往意味著服務暫時無法正常響應,需要恢復。隨著吐出Core文件的進程內存空間增大,這個過程可能持續較長時間。例如,當進程佔用超過60GB內存時,完整Core文件的寫入磁碟可能需要15分鍾,期間產生的流量損失難以估量。
然而,Core文件的存在也有其正面作用。在進程被終止的同時,操作系統會保存下當時的現場數據,這些數據就像是被按下的快門所拍攝的照片。照片中包含了進程終止時的內存、CPU寄存器等信息,這些數據可以供開發人員進行調試。Core文件的產生原因多種多樣,例如在某些Unix版本中,由於不支持現代Linux上的GDB直接附著到進程上進行調試的機制,需要先向進程發送終止信號,然後用工具閱讀Core文件。在Linux系統中,我們可以通過kill命令向指定進程發送信號或使用gcore命令使其主動產生Core文件並退出。
從淺層次來看,Core文件的產生意味著當前進程存在Bug,需要程序員修復。從深層次來看,這實際上是當前進程觸犯了某些OS層級的保護機制,促使OS向當前進程發送諸如SIGSEGV(即信號11)之類的信號,例如訪問空指針或數組越界。實際上,這反映了對OS內存管理的觸犯,訪問了非當前進程的內存空間。OS通過Core文件進行警示,就像人體內的病毒觸發免疫系統的發熱反應一樣。有趣的是,並非每次數組越界都會產生Core文件,這與OS內存管理中的虛擬頁面分配大小和邊界有關。即使不出Core文件,也可能讀到臟數據,引起程序行為紊亂,這是一類難以追蹤的Bug。
Core文件的產生行為和方式可以通過兩種途徑進行控制。首先,可以修改/proc/sys/kernel/core_pattern文件,此文件用於控制Core文件的生成規則。默認情況下,文件內容為「core」。此文件支持定製,可以使用%配合不同的字元,例如%p表示出Core進程的PID,%u表示出Core進程的UID,%s表示造成Core的信號號,%t表示出Core的時間,%e表示出Core進程對應的可執行文件名。其次,可以使用ulimit -c命令顯示當前OS對於Core文件大小的限制。如果為0,則表示不允許產生Core文件。如果想進行修改,可以使用ulimit -c n,其中n為數字,表示允許Core文件體積的最大值,單位為KB。如果想設為無限大,可以執行ulimit -c unlimited。
產生Core文件之後,就需要對其進行查看和分析,以確定問題所在並進行修復。為此,我們可以先了解Core文件的格式,多了解一些Core文件的相關信息。
㈡ Linux CoreDump 生成原理剖析
core文件是Linux系統在程序遇到嚴重錯誤時自動生成的一種文件,用於記錄現場信息,以便後續進行原因追蹤與分析。核心信息由Linux內核負責生成。
core文件的結構大致由ELF文件和特定類型段組成,類型標記為CORE,其中包含一個用於存放豐富現場信息的NOTE段,以及一個或多個LOAD段,這些LOAD段對應虛擬地址空間的片段。
核心信息段包括但不限於每個線程的寄存器狀態、地址空間中文件映射情況、觸發信號詳情、線程局部變數信息等,為故障診斷提供寶貴的線索。
核心文件的生成途徑主要通過向程序發送特定信號來觸發,如SIGABRT信號或其他引起系統異常的錯誤。當程序從內核態轉回用戶態時,系統會檢查是否需要處理信號。若用戶自定義了信號處理函數,則返回至該函數執行;否則內核會執行默認處理邏輯,清理資源或終止進程。
用戶態下生成coremp通常通過調用abort()函數實現,該函數最終通過系統調用syscall kill向目標進程發送SIGABRT信號。殺信號的處理過程包括設置相關標志,返回用戶態檢查,等待子線程結束並收集虛擬地址空間映射信息,最後將這些信息序列化到核心文件中。