目錄
前言:" >前言:
#劇情介紹:" >#劇情介紹:
範例一:指標初始化失敗" >範例一:指標初始化失敗
示例二:另一个指针问题" >示例二:另一个指针问题
示例三:内存溢出" >示例三:内存溢出
結語" >結語
首頁 系統教程 Linux Linux開發coredump檔案分析實戰分享

Linux開發coredump檔案分析實戰分享

Feb 05, 2024 pm 01:10 PM
linux linux教程 linux系統 堆疊溢位 linux指令 shell腳本 嵌入式linux 良許 linux入門 linux學習

前言:

#在嵌入式Linux開發中,分析coredump檔案是常用的方法,我們經常可以在網路上找到相關的使用教學。然而,很少有介紹如何分析多執行緒應用程式的coredump檔案的文章。今天我來分享一些實際使用上遇到的案例,希望能提供給大家一些幫助。由於程式碼和篇幅的限制,我只會描述我認為比較有特色的問題,並以框架思維去解決許多遇到的coredump檔案的情況。

作者:良知猶存

轉載授權與圍觀:歡迎關注微信公眾號:羽林君

或新增作者個人微信:become_me


#劇情介紹:

在偵錯一個功能時,我產生了一些coredump文件,並且出現了不同的程式報錯情況。透過這個機會,我想分享給大家。一般而言,coredump檔案產生的原因可能是空指標、陣列越界、多執行緒多次釋放、堆疊溢位等等。 在這裡我按照自己遇到的情況挑選了一些代表性的問題,與大家分享一些簡單的解決想法。

首先,要進行對應的偵錯,我們需要使用gdb工具。在開始分析coredump檔案之前,需要先熟悉gdb的各個指令。以下是我之前寫的兩篇關於gdb調試的文章:

一文入門Linux下gdb調試(一)

一文入門Linux下gdb調試(二)

因此,本文將不再贅述這些內容,只著重在分析coredump檔案時,我們需要進行的實際操作。

首先,我們需要使用具有偵錯資訊的可執行檔進行偵錯。

gdb executable_file coredump_file
登入後複製

範例一:指標初始化失敗

進入之後第一件事就是 使用 bt指令查看堆疊資訊

Linux開發coredump檔案分析實戰分享

在這個coredump檔案中,我們很容易看到一個函數的傳入位址和類別成員函數有明顯的資料差異。如此明顯的部分我們就可以直接下定論之後,進行細節檢視。

f  n 
登入後複製

透過幀編號來選擇幀,幀編號可以透過 bt 指令來查看。

我们查看对应的第 17帧的堆栈信息

Linux開發coredump檔案分析實戰分享

通过上面截图我们可以看到在第17帧中 this这个类实体化的地址出现了问题。

为了对比我们又查看了对应20帧的堆栈信息以及对应帧的详细信息

Linux開發coredump檔案分析實戰分享

然后我们需要确认该指针是什么什么出现问题的,进行第20帧数据的详细查看。其中我们用p命令查看该类下面的对应的和17帧this的关系,确认gyro_在这个函数执行的时候,地址是否正确。

Linux開發coredump檔案分析實戰分享Linux開發coredump檔案分析實戰分享

从上面来看在此处函数执行的时候,对应的gyro的地址还没有变成错误的0x1388。

从这里我们基本可以确认到,函数从 第20帧对应位置执行之后再到17帧的函数的时候,执行函数的地址发生了改变 然后开始进入校对代码的环节。

这个时候校对不是看代码执行的具体情况,因为发生问题的部分已经是被修改了指针地址。所以我们需要从全局去看这个实体类被进行实体化和释放操作的地方。

最终找到了一个出现线程调用先后顺序导致变量没有准备好,出现的死机情况。

示例二:另一个指针问题

进入之后第一件事情 使用 bt命令查看堆栈信息

这个coredump文件在使用bt命令之后发现 此处的堆栈信息看上去都很正常,无法显示出代码在哪里了出现了问题。

Linux開發coredump檔案分析實戰分享

这个时候我们就要考虑多线程时候,堆栈信息不一定直接捕获到对应线程,我们需要打开所有线程里面的堆栈信息。

thread apply all bt
登入後複製

除了bt大家也可以打印自己需要的其他信息

thread apply all command //所有线程都执行命令
登入後複製
Linux開發coredump檔案分析實戰分享

对应打印出所有线程的堆栈信息之后,我们就进行一点点查看,但是如果你的代码定义了 信号处理函数,例如我使用了 handle_exit进行处理,然后我就在所有线程堆栈信息里面去搜索对应最后面信号处理的函数,再往回查看程序执行的过程。

此时我们发现led一个实体化类的的初始地址出现了问题,最后校验代码,发现了这个bug。

示例三:内存溢出

进入之后第一件事情 使用 bt命令查看堆栈信息

此时发现当前堆栈信息也无法进行定位到问题。

Linux開發coredump檔案分析實戰分享

然後我們使用了thread apply all bt 但是第一遍我們沒有看到對應的hand_exit函數

然後我們使用 info locals來查看保存的本地變數的資訊

Linux開發coredump檔案分析實戰分享

 

info f addr列印透過addr指定幀的資訊。 info args列印函數變數的值。

info locals 列印本地變數的資訊。

info catch列印出目前的函數中的異常處理資訊。

本地變數也沒有一些明顯表示指標錯誤、資料越界的一些顯示。

所以 我們又使用 p 指令列印幀資訊裡面保存的變數資訊。

Linux開發coredump檔案分析實戰分享

透過列印這些我們認為出錯率比較高的變數訊息,可以輔助我們進行判斷。不過本次列印也沒辦法確認到問題位置。

然後我們重新看全部執行緒的堆疊資訊。最後看到了一個異常的參數,這個值很大,有些異常。

緊接著我們進行查看對應的原始碼位置,因為是C 的函式庫,所以我們直接看編譯位置的程式碼。

Linux開發coredump檔案分析實戰分享

先看 第7 幀 訊息顯示的stl_algobase.h:465

開啟對應的代碼位置之後發現**__n**參數 是進行分配空間的數量的參數。

Linux開發coredump檔案分析實戰分享

再次查看執行前後的 stl_vector.h:343

#Linux開發coredump檔案分析實戰分享

而現在傳入的__n大約是大於億的單位值,而程式碼實際工作的位置是不需要這麼大的空間分配的。所以確認是這裡有問題,對照程式碼執行的位置以及對應變數的全域使用情況,最後基本定性為佇列在多執行緒使用中,鎖沒有使用好,導致多個執行緒在極端情況下,輸出和輸入操作會對同一個區域進行,導致了這次代碼死機。

結語

這是我分享的專案中分析coredump檔案的狀況,如果大家有更好的想法和需求,也歡迎大家加我好友交流分享哈。

此外除了我文中使用的這些指令,大家也可以輔助gbd調試的更多指令來檢查我們coredump檔。例如查看彙編程式碼等等。網路上關於gdb調試指令的文章還是很多,大家也可以輔助看其他文章指令使用。

以上是Linux開發coredump檔案分析實戰分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

vscode需要什麼電腦配置 vscode需要什麼電腦配置 Apr 15, 2025 pm 09:48 PM

VS Code 系統要求:操作系統:Windows 10 及以上、macOS 10.12 及以上、Linux 發行版處理器:最低 1.6 GHz,推薦 2.0 GHz 及以上內存:最低 512 MB,推薦 4 GB 及以上存儲空間:最低 250 MB,推薦 1 GB 及以上其他要求:穩定網絡連接,Xorg/Wayland(Linux)

Linux體系結構:揭示5個基本組件 Linux體系結構:揭示5個基本組件 Apr 20, 2025 am 12:04 AM

Linux系統的五個基本組件是:1.內核,2.系統庫,3.系統實用程序,4.圖形用戶界面,5.應用程序。內核管理硬件資源,系統庫提供預編譯函數,系統實用程序用於系統管理,GUI提供可視化交互,應用程序利用這些組件實現功能。

notepad怎麼運行java代碼 notepad怎麼運行java代碼 Apr 16, 2025 pm 07:39 PM

雖然 Notepad 無法直接運行 Java 代碼,但可以通過借助其他工具實現:使用命令行編譯器 (javac) 編譯代碼,生成字節碼文件 (filename.class)。使用 Java 解釋器 (java) 解釋字節碼,執行代碼並輸出結果。

vscode終端使用教程 vscode終端使用教程 Apr 15, 2025 pm 10:09 PM

vscode 內置終端是一個開發工具,允許在編輯器內運行命令和腳本,以簡化開發流程。如何使用 vscode 終端:通過快捷鍵 (Ctrl/Cmd ) 打開終端。輸入命令或運行腳本。使用熱鍵 (如 Ctrl L 清除終端)。更改工作目錄 (如 cd 命令)。高級功能包括調試模式、代碼片段自動補全和交互式命令歷史。

git怎麼查看倉庫地址 git怎麼查看倉庫地址 Apr 17, 2025 pm 01:54 PM

要查看 Git 倉庫地址,請執行以下步驟:1. 打開命令行並導航到倉庫目錄;2. 運行 "git remote -v" 命令;3. 查看輸出中的倉庫名稱及其相應的地址。

vscode 無法安裝擴展 vscode 無法安裝擴展 Apr 15, 2025 pm 07:18 PM

VS Code擴展安裝失敗的原因可能包括:網絡不穩定、權限不足、系統兼容性問題、VS Code版本過舊、殺毒軟件或防火牆干擾。通過檢查網絡連接、權限、日誌文件、更新VS Code、禁用安全軟件以及重啟VS Code或計算機,可以逐步排查和解決問題。

vscode在哪寫代碼 vscode在哪寫代碼 Apr 15, 2025 pm 09:54 PM

在 Visual Studio Code(VSCode)中編寫代碼簡單易行,只需安裝 VSCode、創建項目、選擇語言、創建文件、編寫代碼、保存並運行即可。 VSCode 的優點包括跨平台、免費開源、強大功能、擴展豐富,以及輕量快速。

Linux的主要目的是什麼? Linux的主要目的是什麼? Apr 16, 2025 am 12:19 AM

Linux的主要用途包括:1.服務器操作系統,2.嵌入式系統,3.桌面操作系統,4.開發和測試環境。 Linux在這些領域表現出色,提供了穩定性、安全性和高效的開發工具。

See all articles