GDB: coredump

前言:一句話如下使用

gdb [exec_file] [core_file]

# or
gdb -c [core_file] [exec_file]???#-c指定轉儲的core文件

gdb -c core.5213?spp_uc_frequent_contact_ol_worker

# 進入后輸入bt查看調用棧

bt? ? ?#顯示所有幀棧

bt 10? #顯示前面10個幀棧(感覺沒啥用)

bt -10 #顯示后面10個幀棧(感覺沒啥用)

bt full? #顯示幀棧以及局部變量

效果如下:

這篇文章主要講GDB和coredump兩個方面。

一、CoreDump

1. coredump簡介

  1. core,又稱coredump文件,準確來講是Unix/Linux的記錄機制產生的一種保存程序崩潰時現場狀態的記錄性文件。
  2. 為何需要這種記錄機制?原因很簡單,程序在在正常執行的時候當然是皆大歡喜,但是如果程序出現致命性錯誤難道不要保存一些現場信息已被分析使用嗎!!Unix/Linux也是如此。Unix/Linux將程序工作的當前狀況存儲成一個文件,主要包括程序運行時候的內存狀態、寄存器狀態、堆棧指針、內存管理等現場信息,這就是coredump。可以說表示這種機制也可以表示該機制產生的文件。
  3. 在程序崩潰的一瞬間,內核會拋出當時該程序進程的內存詳細情況,存儲在core.xxx文件中(xxx為一個數字如core.699)。
  4. 如果硬要翻譯的話。(core:內存/核心)、(dump:拋出/扔出)。coredump連起來可以直譯為“吐核”。

2. coredump機制的優缺點分析

缺點:伴隨著core進程的內存空間越大,生成core文件(將內存現場狀態寫入磁盤)的時間就越長。

優點:終止是內存、寄存器、各種函數堆棧信息的保留使得開發人員可以進行調試。

注:當然可以設定coredump產生的條件,指定當前回話可以生成的coredump文件大小(后續講到)。

3. coredump文件的存儲路徑及名稱

之所以說這個問題是因為有時候執行程序出現提示Segmentation?fault,但是當前目錄下并沒有coredump文件。此時,記得check下這里。

對于私有化場景 開啟了spp服務的core文件收集但是并沒有看到core文件:

——解決辦法就是在k8s所有母雞全部開啟core文件收集并指定目錄。

(1)查詢core文件位置

執行如下指令:

cat /proc/sys/kernel/core_pattern

默認值是core,表示當前目錄。否則就是在指定目錄下。

(2)更改coredump文件的存儲位置

通過下面的命令可以更改coredump文件的存儲位置,若你希望把core文件生成到/my/coredata目錄下:

echo “/my/coredata”> /proc/sys/kernel/core_pattern

(3)指定內核生成的coredump文件的文件名

通過修改kernel的參數可以指定內核所生成的coredump文件的文件名。例如,使用下面的命令使kernel生成名字為core.filename.pid格式的core dump文件:

echo “/data/coredump/core.%e.%p” >/proc/sys/kernel/core_pattern

這樣配置后,產生的core文件中將帶有崩潰的程序名、以及它的進程ID。上面的%e和%p會被替換成程序文件名以及進程ID。
?

4、產生coredump文件的條件

ps:這個尤其值得注意。因為通常默認的core文件大小都是0.

(1)查詢當前會話能生成的coredump文件的大小——ulimit? -c

? ? ? ??

????????ps:通常段錯誤卻不生成core文件的原因就是因為這個0.

(2)設置當前回話允許生成的coredump文件大小

????????1)ulimit -c unlimited

????????2)ulimit -c [size]

????????注:(1)這里的size單位是block,1block=512byte。

????????????????(2)以上設置都只是對當前會話有效,若想系統均有效,需進行如下設置。

3)在etc/profile中加入一下一行:

ulimit -c unlimited

ps:這個特性可以用于避免過大core文件生成的作用。

5、coredump產生的原因

造成程序coredump的原因有很多,這里總結一些常見情況:

(1)內存訪問越界

? ? ? a) 由于使用錯誤的下標,導致數組訪問越界。

? ? ? b) 搜索字符串時,依靠字符串結束符來判斷字符串是否結束,但是字符串沒有正常的使用結束符。

? ? ? c) 使用strcpy, strcat, sprintf, strcmp,strcasecmp等字符串操作函數,將目標字符串讀/寫爆。應該使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函數防止讀寫越界。

(2)多線程程序使用了線程不安全的函數。

應該使用下面這些可重入的函數,它們很容易被用錯:

asctime_r(3c) gethostbyname_r(3n) getservbyname_r(3n)ctermid_r(3s) gethostent_r(3n) getservbyport_r(3n) ctime_r(3c) getlogin_r(3c)getservent_r(3n) fgetgrent_r(3c) getnetbyaddr_r(3n) getspent_r(3c)fgetpwent_r(3c) getnetbyname_r(3n) getspnam_r(3c) fgetspent_r(3c)getnetent_r(3n) gmtime_r(3c) gamma_r(3m) getnetgrent_r(3n) lgamma_r(3m) getauclassent_r(3)getprotobyname_r(3n) localtime_r(3c) getauclassnam_r(3) etprotobynumber_r(3n)nis_sperror_r(3n) getauevent_r(3) getprotoent_r(3n) rand_r(3c) getauevnam_r(3)getpwent_r(3c) readdir_r(3c) getauevnum_r(3) getpwnam_r(3c) strtok_r(3c) getgrent_r(3c)getpwuid_r(3c) tmpnam_r(3s) getgrgid_r(3c) getrpcbyname_r(3n) ttyname_r(3c)getgrnam_r(3c) getrpcbynumber_r(3n) gethostbyaddr_r(3n) getrpcent_r(3n)

(3)多線程讀寫的數據未加鎖保護。

對于會被多個線程同時訪問的全局數據,應該注意加鎖保護,否則很容易造成coredump

(4)非法指針

? ? ? a) 使用空指針

? ? ? b) 隨意使用指針轉換。一個指向一段內存的指針,除非確定這段內存原先就分配為某種結構或類型,或者這種結構或類型的數 組,否則不要將它轉換為這種結構或類型的指針,而應該將這段內存拷貝到一個這種結構或類型中,再訪問這個結構或類型。這是因為如果這段內存的開始地址不是按照這種結構或類型對齊的,那么訪問它時就很容易因為bus error而core dump。

(5)堆棧溢出

不要使用大的局部變量(因為局部變量都分配在棧上),這樣容易造成堆棧溢出,破壞系統的棧和堆結構,導致出現莫名其妙的錯誤。
?

6、如何判斷一個文件是core文件

readelf -h 讀取coredump文件頭。如下圖所示:

二、GDB+coredump

1、使用GDB,需要先從執行文件中讀取符號表信息,然后再讀取core文件。即

gdb? test? core.2919

原因:core文件中沒有符號表信息,無法進行調試。驗證如下:objdump -x core.2919 | tail

2、調試過程如下(和使用gdb調試其他程序幾乎一樣):

從上面可以看出出問題的是第十三行。

當然進入GDB之后也可以直接執行where可以立馬找出出錯的位置。如下所示:

/*************************************************************************> File Name: test.cpp> Author: ma6174> Mail: ma6174@163.com > Created Time: 2018年12月24日 星期一 19時10分39秒************************************************************************/#include<stdio.h>int main(){int b=1;int *a=NULL;*a=b;return 0;
}

三、演示gdb調試coredump

(1)源程序如下

#include<stdio.h>
void do_it();
int main(){do_it();return 0;
}
void do_it(){//定義一個字符指針變量a,指向地址1.這個地址肯定不是自己可以訪問的,但是這行不會產生段錯誤。char* p=1;//視圖更改地址1出的值,內核會終止該進程,并把core文件dump出來。*p='a';
}

(2)必要的準備

????????1)確定core文件的生成位置,免得待會兒找不到。(此處采用默認的當前位置)

????????2)設置產生條件 ulimit -c unlimited ,免得一直段錯誤,就是不吐核。

????????3)記住編譯時要加-g選項,gcc -g -o test1 test1.c

(3)運行test1程序 如下

????????

????????說明core已經被dump了,查看對于的core文件是core.3177。

????????

?????????注:每一次執行./test1都會生成一個core.xxx文件,他們的記錄的信息應該都是一樣的。

(4)開始調試

????????調試過程非常簡單:gdb test1 core.3177。進入后運行where即可列出出錯的位置了。

????????

參考:

GDB定位coredump_gdb coredump-CSDN博客

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/73862.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/73862.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/73862.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

21_js正則_表單驗證

目錄 正則 一、 正則的概念 二、創建正則方式 2.1 構造函數去創建正則 2.2 字面量去創建正則 2,3 test方法 三、正則修飾符 四、 正則的方法 lastIndex test方法 exec 五、字符串方法 replace match search split 六、正則表達式的構成 元字符-- 定位符 元字…

礦山自動化監測解決方案

1.行業現狀 為貫徹落實《中共中央國務院關于推進安全生產領域改革發展的意見》《“十四五”礦山安全生產規劃》&#xff08;應急〔2022〕64號&#xff09;、《國務院安委會辦公室關于加強礦山安全生產工作的緊急通知》&#xff08;安委辦〔2021〕3號&#xff09;等有關工作部署…

企業級知識庫建設:自建與開源產品集成的全景解析 —— 產品經理、CTO 與 CDO 的深度對話

文章目錄 一、引言二、主流產品與方案對比表三、自建方案 vs. 開源產品集成&#xff1a;技術路徑對比3.1 自建方案3.2 開源產品集成方案 四、結論與個人觀點 一、引言 在當今數據驅動的商業環境中&#xff0c;構建高質量的知識庫已成為企業數字化轉型的關鍵一環。本博客分別從…

【藍橋杯】單片機設計與開發,溫度傳感器DS18B20

一、溫度傳感器概述 結構圖 二、通信過程 三、onewire單總線協議概述 四、單總線的工作原理 黑粗線是單片機發送的&#xff0c;淺的是s18b20回應的 五、溫度傳感器的應用 六、onewire 七、課后習題

Python 在Word中查找并替換文本

在操作Word文檔時&#xff0c;如果想要修正一處反復出現的拼寫錯誤&#xff0c;統一文中前后不一致的術語&#xff0c;或者將文檔中所有的舊聯系方式更新為新號碼。這時我們可以使用 Word中的查找替換功能&#xff0c;快速定位并批量處理文檔中的特定文本&#xff0c;提升編輯效…

Python 筆記 (二)

Python Note 2 1. Python 慢的原因2. 三個元素3. 標準數據類型4. 字符串5. 比較大小: 富比較方法 rich comparison6. 數據容器 (支持*混裝* )一、允許重復類 (list、tuple、str)二、不允許重復類 (set、dict)1、集合(set)2、字典(dict)3、特殊: 雙端隊列 deque 三、數據容器的共…

kill子進程后再wait可以嗎?

在父進程中先使用 kill 函數終止子進程&#xff0c;之后再使用 wait 函數是可行的&#xff0c;下面從原理、使用示例、注意事項幾個方面詳細說明。 原理 kill 函數&#xff1a;其作用是向指定進程發送信號。當向子進程發送 SIGTERM&#xff08;通常用于請求進程正常終止&…

ai-api-union項目,適配各AI廠商api

項目地址&#xff1a;alpbeta/ai-api-union 需求&#xff1a;實現兼容各大模型廠商api的流式對話和同步對話接口&#xff0c;本項目現兼容智譜、豆包、通義、通義版deepseek 設計 一個ChatController類對外暴露這兩個接口&#xff0c;入參都為ChatRequest請求類&#xff0c;…

【QT】QT樣式設計

QT樣式設計 一、QT工程中添加資源文件1.資源文件&#xff1a;2. 添加步驟&#xff1a;3. 新增資源文件以及刪除現有的資源文件4. 使用資源文件 二、QT中的qss語句(樣式設計語句)1. 樣式設計2.常見的qss語句示例代碼&#xff1a; 一、QT工程中添加資源文件 1.資源文件&#xff…

Megatron-LM中的deepseek-v3實現

Megatron-LM&#xff1a;https://github.com/NVIDIA/Megatron-LM/tree/main 使用此倉庫構建的著名的庫也有很多&#xff0c;如: Colossal-AI, HuggingFace Accelerate, and NVIDIA NeMo Framework.Pai-Megatron-Patch工具是阿里人工智能平臺PAI算法團隊研發,ai-Megatron-Patch…

[mlr3] Bootstrap與交叉驗證k-fold cross validation

五折交叉驗證因其無放回分層抽樣和重復驗證機制&#xff0c;成為超參數調優的首選&#xff1b; 而Bootstrap因有放回抽樣的重復性和驗證集的不穩定性&#xff0c;主要服務于參數估計&#xff08;置信區間的計算&#xff09;而非調優。 實際應用中&#xff0c;可結合兩者優勢&am…

某大麥手機端-搶票

引言 僅供學習研究&#xff0c;歡迎交流 搶票難&#xff0c;難于上青天&#xff01;無論是演唱會、話劇還是體育賽事&#xff0c;大麥網的票總是秒光。作為一名技術愛好者&#xff0c;你是否想過用技術手段提高搶票成功率&#xff1f;本文將為你揭秘大麥手機端搶票的核心技術…

最常使用的現代C++新特性介紹

現代 C泛指的是從 C11 之后的 C標準. 從 C11 開始, C標準委員會實行班車制, 沒三年發布一個新版本, 如果一個功能在新版本發布之前已經準備好, 則可以加入該版本中, 否則延后到下一個版本. 語言核心 自 C11 開始, 語言語法層面加了許多語法糖, 還有增加了一些新語法.使得 C語…

SQL Server:當在刪除數據庫時因為存在觸發器而無法刪除

當在刪除數據庫時因為存在觸發器而無法刪除&#xff0c;你可以通過禁用觸發器來解決這個問題。下面為你介紹在 SQL Server 里禁用和啟用觸發器的方法。 禁用數據庫中所有表的觸發器 你可以使用系統視圖 sys.triggers 來查詢數據庫里所有的觸發器&#xff0c;然后生成禁用這些…

【Linux篇】進程入門指南:操作系統中的第一步

步入進程世界&#xff1a;初學者必懂的操作系統概念 一. 馮諾依曼體系結構1.1 背景與歷史1.2 組成部分1.3 意義 二. 進程2.1 進程概念2.1.1 PCB&#xff08;進程控制塊&#xff09; 2.2 查看進程2.2.1 使用系統文件查看2.2.2 使?top和ps這些??級?具來獲取2.2.3 通過系統調用…

銷售易vs紛享銷客:制造行業CRM選型深度解析

“以客戶為中心”&#xff0c;顧名思義就是指讓客戶貫穿企業市場、研發、生產、銷售、服務全流程&#xff0c;以客戶需求為導向進行經營。CRM作為企業數字化建設基礎設施&#xff0c;在企業高質量發展進程中扮演著重要角色。在眾多CRM解決方案中&#xff0c;騰訊旗下CRM銷售易憑…

【JavaScript】九、JS基礎練習

文章目錄 1、練習&#xff1a;對象數組的遍歷2、練習&#xff1a;猜數字3、練習&#xff1a;生成隨機顏色 1、練習&#xff1a;對象數組的遍歷 需求&#xff1a;定義多個對象&#xff0c;存數組&#xff0c;遍歷數據渲染生成表格 let students [{ name: 小明, age: 18, gend…

代碼隨想錄day31 貪心part05

56.合并區間 以數組 intervals 表示若干個區間的集合&#xff0c;其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間&#xff0c;并返回 一個不重疊的區間數組&#xff0c;該數組需恰好覆蓋輸入中的所有區間 。 示例 1&#xff1a; 輸入&#xff1a;in…

《C++11:通過thread類編寫C++多線程程序》

關于多線程的概念與理解&#xff0c;可以先了解Linux下的底層線程。當對底層線程有了一定程度理解以后&#xff0c;再學習語言級別的多線程編程就輕而易舉了。 【Linux】多線程 -&#xff1e; 從線程概念到線程控制 【Linux】多線程 -&#xff1e; 線程互斥與死鎖 語言級別的…

c++位運算總結

在C中&#xff0c;位運算是對二進制位進行操作的運算&#xff0c;主要有以下幾種&#xff1a; 1. 按位與&#xff08; & &#xff09;&#xff1a;兩個操作數對應位都為1時&#xff0c;結果位才為1&#xff0c;否則為0。例如 3 & 5 &#xff0c; 3 二進制是 0000 0011…