學會用core dump除錯程式錯誤
前言
最近在專案中遇到大型程式出現SIGSEGV ,一直不知道用core dump工具來除錯程式,花了近一週的時間,才定位問題,老大很生氣,後果很嚴重,呵呵,事後仔細學習了這塊的知識,瞭解一點core dump的知識。
在使用半導體作為記憶體的材料前,人類是利用線圈當作記憶體的材料(發明者為王安),線圈就叫作core ,用線圈做的記憶體就叫作“core memory”。(線圈的單詞應該是coil,呵呵)如今,半導體工業澎勃發展,已經沒有人用線圈當記憶體了,不過,在許多情況下,人們還是把記憶體叫作“core”。 所以注意了:這裡的core不是核心,而是記憶體。不過結合實際來看,好像也有點“核心所佔記憶體”的意思。
core dump又是什麼東東? 我們在開發(或使用)一個程式時,最怕的就是程式莫明其妙地掛掉。雖然系統沒事,但我們下次仍可能遇到相同的問題。於是,這時作業系統就會把程式掛掉時的 記憶體內容寫入一個叫做core的檔案裡(這個寫入的動作就叫dump,dump的英語意思是垃圾、傾倒。從這裡來看,這些記憶體的內容是程式錯誤執行的結果,所以算是垃圾,把他弄出來就好比從大的記憶體池裡“傾倒”。),以便於我們除錯。這個過程,因此叫做core dump.在嵌入式系統中,有時core dump直接從串列埠列印出來,結合objdump查詢ra和epa地址,運用棧回溯,可以找到程式出錯的地方。
如何產生core dump檔案
在一般Linux系統中,預設是不會產生core dump檔案的,通過ulimit -c來檢視core dump檔案的大小,一般開始是0,可以設定core檔案大小,ulimit -c 1024(kbytes單位)或者ulimit -c unlimited。
core dump檔案輸出設定
一般預設是當前目錄,可以在/proc/sys/kernel中找到core-user-pid,通過
1.使core檔名加上pid號
echo "1" > /proc/sys/kernel/core-user-pid
2.控制core檔案儲存位置和檔名格式
mkdir -p /root/corefile echo "/root/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
以下是引數列表:
%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 新增命令名
用gdb檢視core檔案
下面我們可以在發生執行時訊號引起的錯誤時發生core dump了.編譯時加上-g
發生core dump之後, 用gdb進行檢視core檔案的內容, 以定位檔案中引發core dump的行.
gdb [exec file] [core file]
如:
gdb ./test test.core
在進入gdb後, 用bt命令檢視backtrace以檢查發生程式執行到哪裡, 來定位core dump的檔案行.
例項講解
//test.c void a() { char *p = NULL; printf("%d/n", *p); } int main() { a(); return 0; }
編譯
gcc -g -o test test.c
執行 ./test
報segmentation fault(core dump)
如果生成的是test.core.
gdb ./test test.core
相關文章
- 除錯利器 Laravel Dump Server除錯LaravelServer
- nginx 錯誤除錯Nginx除錯
- rac錯誤除錯除錯
- 物聯網學習教程—常見錯誤和程式除錯除錯
- 除錯利器:用GDB檢視core dump (zz) - 藍ka的日誌 - 網易部落格除錯
- 使用VS Code開發 除錯.NET Core 應用程式除錯
- 刪除應用程式對映會導致OWA出現404錯誤
- 用GDB除錯程式除錯
- Python學習之錯誤除錯和測試Python除錯
- 怎樣用除錯工具Dump Oracle系統狀態除錯Oracle
- 除錯技巧 —— 如何利用windbg + dump + map分析程式異常除錯
- Flutter 應用程式除錯Flutter除錯
- 用GDB除錯程式(六)除錯
- 用strace除錯程式(zt)除錯
- 在 Istio 中除錯 503 錯誤除錯
- 【CUDA學習】核心程式除錯除錯
- 用WinDBG遠端除錯程式除錯
- 用GDB除錯程式(二) (轉)除錯
- 用GDB除錯程式(四) (轉)除錯
- 用GDB除錯程式(三) (轉)除錯
- Python 之 錯誤,除錯和測試Python除錯
- 關於weblogic pool 一錯誤除錯Web除錯
- PHP檔案上傳錯誤程式碼,狀態測試,除錯PHP除錯
- [譯]用 LLDB 除錯 Swift 程式碼LLDB除錯Swift
- Python 程式碼除錯—使用 pdb 除錯Python除錯
- 安裝.NET Core遇到的錯誤
- 還在斷點除錯?教你四種除錯技巧讓你快速定位錯誤!斷點除錯
- 前端的水平線,錯誤處理和除錯前端除錯
- .NET應用程式除錯—原理、工具、方法除錯
- .NET應用程式除錯:原理、工具、方法除錯
- linux下用gdb除錯c程式Linux除錯C程式
- TCP網路除錯助手提示錯誤:“1035:未知錯誤” 解決方案TCP除錯
- 程式出錯時如何找到錯誤?
- 除錯:案例學習除錯
- 反除錯&反反除錯 -- 利用sysctl檢測偵錯程式是否存在除錯
- 應用程式邏輯錯誤總結
- Windows 8啟用錯誤程式碼解析Windows
- 除錯篇——除錯物件與除錯事件除錯物件事件