搜尋
首頁系統教程LinuxLinux開發coredump檔案分析實戰分享

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

Feb 05, 2024 pm 01:10 PM
linuxlinux教程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中文網其他相關文章!

陳述
本文轉載於:良许Linux教程网。如有侵權,請聯絡admin@php.cn刪除
Linux的主要目的是什麼?Linux的主要目的是什麼?Apr 16, 2025 am 12:19 AM

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

互聯網在Linux上運行嗎?互聯網在Linux上運行嗎?Apr 14, 2025 am 12:03 AM

互聯網運行不依賴單一操作系統,但Linux在其中扮演重要角色。 Linux廣泛應用於服務器和網絡設備,因其穩定性、安全性和可擴展性受歡迎。

Linux操作是什麼?Linux操作是什麼?Apr 13, 2025 am 12:20 AM

Linux操作系統的核心是其命令行界面,通過命令行可以執行各種操作。 1.文件和目錄操作使用ls、cd、mkdir、rm等命令管理文件和目錄。 2.用戶和權限管理通過useradd、passwd、chmod等命令確保系統安全和資源分配。 3.進程管理使用ps、kill等命令監控和控制系統進程。 4.網絡操作包括ping、ifconfig、ssh等命令配置和管理網絡連接。 5.系統監控和維護通過top、df、du等命令了解系統運行狀態和資源使用情況。

使用Linux別名提高自定義命令快捷方式的生產率使用Linux別名提高自定義命令快捷方式的生產率Apr 12, 2025 am 11:43 AM

介紹 Linux是一個強大的操作系統,由於其靈活性和效率,開發人員,系統管理員和電源用戶都喜歡。但是,經常使用長而復雜的命令可能是乏味的

Linux實際上有什麼好處?Linux實際上有什麼好處?Apr 12, 2025 am 12:20 AM

Linux適用於服務器、開發環境和嵌入式系統。 1.作為服務器操作系統,Linux穩定高效,常用於部署高並發應用。 2.作為開發環境,Linux提供高效的命令行工具和包管理系統,提升開發效率。 3.在嵌入式系統中,Linux輕量且可定制,適合資源有限的環境。

在Linux上掌握道德黑客的基本工具和框架在Linux上掌握道德黑客的基本工具和框架Apr 11, 2025 am 09:11 AM

簡介:通過基於Linux的道德黑客攻擊數字邊界 在我們越來越相互聯繫的世界中,網絡安全至關重要。 道德黑客入侵和滲透測試對於主動識別和減輕脆弱性至關重要

如何學習Linux基礎知識?如何學習Linux基礎知識?Apr 10, 2025 am 09:32 AM

Linux基礎學習從零開始的方法包括:1.了解文件系統和命令行界面,2.掌握基本命令如ls、cd、mkdir,3.學習文件操作,如創建和編輯文件,4.探索高級用法如管道和grep命令,5.掌握調試技巧和性能優化,6.通過實踐和探索不斷提陞技能。

Linux最有用的是什麼?Linux最有用的是什麼?Apr 09, 2025 am 12:02 AM

Linux在服務器、嵌入式系統和桌面環境中的應用廣泛。 1)在服務器領域,Linux因其穩定性和安全性成為託管網站、數據庫和應用的理想選擇。 2)在嵌入式系統中,Linux因其高度定制性和高效性而受歡迎。 3)在桌面環境中,Linux提供了多種桌面環境,滿足不同用戶需求。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前By尊渡假赌尊渡假赌尊渡假赌

熱工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SecLists

SecLists

SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

VSCode Windows 64位元 下載

VSCode Windows 64位元 下載

微軟推出的免費、功能強大的一款IDE編輯器