Android系統的問題分析筆記 - Android上的調試方式 debuggerd

debuggerd 是 Android 系統中的一個重要調試工具,主要用于生成進程崩潰時的核心轉儲(core dump)和調試信息(如堆棧跟蹤)。以下是關于 debuggerd 的詳細說明:

1. 基本功能

  • 崩潰分析:當 Native 進程(C/C++ 代碼)崩潰時,debuggerd 會捕獲信號(如 SIGSEGVSIGABRT),生成 tombstone 文件(墓碑文件),記錄崩潰時的堆棧、寄存器、內存映射等信息。
  • 主動調試:支持主動附加到運行中的進程,生成堆棧跟蹤(無需崩潰)。

2. 主要命令

(1) 被動觸發(自動)

當進程崩潰時,系統會自動調用 debuggerd 生成 tombstone 文件,保存在 /data/tombstones/ 目錄下(文件名如 tombstone_00)。

(2) 主動調試

  • 獲取進程堆棧
    附加到正在運行的進程并打印堆棧:

    debuggerd -b <pid>
    
    • -b:輸出簡要堆棧(否則生成完整 tombstone 文件)。
  • 生成完整 tombstone 文件

    debuggerd <pid>
    

    輸出文件默認在 /data/tombstones/

(3) 高級選項

  • 回溯特定線程

    debuggerd -t <tid>
    
    • -t:指定線程 ID(而非進程 ID)。
  • 調用 gdbserver 附加調試

    debuggerd --wrapper gdbserver :5039 --attach <pid>
    

    用于遠程 GDB 調試。

3. 關鍵文件路徑

  • Tombstone 文件
    /data/tombstones/tombstone_XX(需 root 權限訪問)。
  • Logcat 輸出
    崩潰日志也會出現在 logcat 中,搜索關鍵字 DEBUG 或進程名。

4. 權限要求

  • 查看其他進程的堆棧需要 root 權限ptrace 能力。
  • 普通應用只能調試自身進程。

5. 使用示例

(1) 捕獲崩潰

  1. 觸發一個 Native 崩潰(如空指針訪問)。
  2. 通過 logcat 或檢查 /data/tombstones/ 查看崩潰詳情。

(2) 主動獲取堆棧

adb shell
su
debuggerd -b <pid>  # 替換為實際進程 ID

6. 分析 tombstone 文件

tombstone 文件包含以下關鍵信息:

  • 信號(如 SIGSEGV)。
  • 堆棧跟蹤(包括庫和函數名)。
  • 寄存器狀態(PC、SP 等)。
  • 內存映射/proc/<pid>/maps)。

使用 ndk-stack 工具(NDK 提供)可以符號化堆棧:

ndk-stack -sym <so文件路徑> -dump tombstone_00

7. 注意事項

  • Android 版本差異
    • Android 8.0+ 使用 crash_dump 替代傳統 debuggerd,但命令兼容。
  • 性能影響
    頻繁附加調試可能導致進程短暫掛起。
  • 安全限制
    非 root 設備可能無法調試系統進程。

8. 相關工具

  • ndk-stack:符號化 tombstone 文件。
  • addr2line(NDK 工具鏈):解析具體代碼行。
  • GDB/LLDB:配合 gdbserver 進行動態調試。

如果需要進一步分析崩潰,建議結合源碼和編譯生成的符號文件(.so 或帶調試信息的二進制)。

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

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

相關文章

python 雙下劃線開頭函數

在 Python 里&#xff0c;雙下劃線開頭的函數&#xff08;準確地說是方法&#xff09;有著特殊的用途和意義。下面為你詳細介紹相關內容&#xff1a; 1. 類的特殊方法&#xff08;魔術方法&#xff09; 以雙下劃線開頭和結尾的方法&#xff0c;被稱為特殊方法或者魔術方法&…

VyOS起步指南:用Docker快速搭建網絡實驗環境

文章目錄1. VyOS是什么&#xff1f;為什么選擇它&#xff1f;2. 五分鐘快速部署&#xff1a;Docker方案3. 進入容器&#xff1a;初探VyOS世界4. 核心操作&#xff1a;像開發者一樣思考5. 踩坑提醒&#xff1a;新手常見問題6. 結語&#xff1a;網絡即代碼的未來1. VyOS是什么&am…

動態規劃理論基礎,LeetCode 509. 斐波那契數 LeetCode 70. 爬樓梯 LeetCode 746. 使用最小花費爬樓梯

動態規劃理論基礎動態規劃&#xff0c;英文&#xff1a;Dynamic Programming&#xff0c;簡稱DP&#xff0c;如果某一問題有很多重疊子問題&#xff0c;使用動態規劃是最有效的。所以動態規劃中每一個狀態一定是由上一個狀態推導出來的&#xff0c;這一點就區分于貪心&#xff…

暑期自學嵌入式——Day02(C語言階段)

點關注不迷路喲。你的點贊、收藏&#xff0c;一鍵三連&#xff0c;是我持續更新的動力喲&#xff01;&#xff01;&#xff01; 主頁&#xff1a; 一位搞嵌入式的 genius-CSDN博客https://blog.csdn.net/m0_73589512?spm1000.2115.3001.5343 目錄 Day02→數據類型&#xf…

如何單獨安裝設置包域名

前言 在 npm 中&#xff0c;直接通過 package-lock.json 無法單獨設置包的安裝地址&#xff0c;因為該文件是自動生成的依賴關系鎖定文件。但你可以通過以下方法間接實現&#xff1a; 一、在 package.json 中指定包來源&#xff08;推薦&#xff09; 在 package.json 的 depend…

存儲過程探秘:數據庫編程的藝術

文章目錄存儲過程語法格式BEGIN...END語句塊DECLARE&#xff08;聲明局部變量&#xff09;流控制語句if函數批處理操作測試2測試3存儲過程與函數的關系存儲過程 MYSQL的存儲過程是一組預處理的SQL語句&#xff0c;可以像函數一樣在數據庫中進行存儲和調用。 它們允許在數據庫…

非阻塞寫入核心:asyncio.StreamWriter 的流量控制與數據推送之道

在 asyncio 的異步編程框架中&#xff0c;如果說 asyncio.StreamReader 是你異步應用的數據輸入管道&#xff0c;那么 asyncio.StreamWriter 就是你異步應用的數據輸出管道。它是一個至關重要的組件&#xff0c;讓你能夠方便、高效且非阻塞地向連接的另一端&#xff08;如 TCP …

控制臺打開mysql服務報錯解決辦法

控制臺打開mysql服務報錯解決辦法這個MySQL錯誤表示訪問被拒絕&#xff0c;通常是因為沒有提供正確的用戶名和密碼。以下是幾種解決方法&#xff1a; 方法1&#xff1a;指定用戶名和密碼連接 mysql -u root -p然后輸入root用戶的密碼。 方法2&#xff1a;如果忘記了root密碼&am…

Unsloth 實戰:DeepSeek-R1 模型高效微調指南(下篇)

食用指南 本系列因篇幅原因拆分為上下兩篇&#xff1a; 上篇以基礎環境搭建為主&#xff0c;介紹了 Unsloth 框架、基座模型下載、導入基座模型、數據集下載/加載/清洗、SwanLab 平臺賬號注冊。 下篇&#xff08;本文&#xff09;以實戰微調為主&#xff0c;介紹預訓練、全量…

Ubuntu安裝Jenkins

Ubuntu安裝Jenkins方法1&#xff1a;使用官方的Jenkins倉庫1. 添加Jenkins倉庫2. 更新軟件包列表3. 安裝Jenkins4. 啟動Jenkins服務5. 設置Jenkins開機啟動6. 查找初始管理員密碼7. 訪問Jenkins方法2&#xff1a;使用Snap包&#xff08;適用于較新的Ubuntu版本&#xff09;1. 安…

ubuntu22.04下配置qt5.15.17開發環境

自從qt5.15版本開始&#xff0c;不再提供免費的離線安裝包&#xff0c;只能通過源碼自行編譯。剛好最近需要在ubuntu22.04下配置qt開發環境&#xff0c;于是寫篇文章記錄配置的過程。 其實一開始是想配置qt5.15.2的&#xff0c;但是在編譯配置參數這一步驟中出現如下報錯 em…

S7-1200 與 S7-300 CPS7-400 CP UDP 通信 Step7 項目編程

S7-1200 CPU 與S7-300 CP STEP7 UDP通信S7-1200 與 S7-300 CP 之間的以太網通信可以通過 UDP 協議來實現&#xff0c;使用的通信指令是在S7-1200 CPU 側調用通信-開放式用戶通信TSEND_C&#xff0c;TRCV_C指令或TCON&#xff0c;TDISCON&#xff0c;TUSEND&#xff0c;TURCV 指…

基于YOLOv11的無人機目標檢測實戰(Windows環境)

1. 環境搭建 1.1 硬件與操作系統 操作系統&#xff1a;Windows 11 CPU&#xff1a;Intel i7-9700 GPU&#xff1a;NVIDIA RTX 2080&#xff08;8GB顯存&#xff09; 1.2 安裝CUDA和cuDNN 由于YOLOv11依賴PyTorch的GPU加速&#xff0c;需要安裝CUDA和cuDNN&#xff1a; 安…

Spring Cloud分布式配置中心:架構設計與技術實踐

從單體到微服務&#xff1a;Spring Cloud 開篇與微服務設計 Spring Cloud服務注冊與發現&#xff1a;架構設計與技術實踐深度分析 在以往分享中&#xff0c;碼友們已經掌握了微服務的設計和注冊中心的設計&#xff0c;部分聰明的碼友已經察覺了&#xff0c;已經到了需要設計一個…

15.2 Common Criteria合規

目錄1. Common Criteria簡介1.1 CC評估要素1.2 CC與TF-A的關系2. TF-A的CC合規要求2.1 安全功能需求2.2 開發過程要求3. TF-A的CC合規實現3.1 關鍵安全機制3.2 開發流程控制4. CC認證實踐指南4.1 認證準備步驟4.2 典型挑戰與解決方案4.3 已認證案例參考5. 持續合規建議1. Commo…

【前端:Typst】--let關鍵字的用法

在 Typst 中&#xff0c;#let 命令是用于定義變量和函數的核心指令&#xff0c;其用法非常靈活。以下是詳細的用法說明和示例。 目錄 1.基礎變量定義 2.函數定義 3.默認參數 4.內容塊參數&#xff08;Content Blocks&#xff09; 5.遞歸函數 1.基礎變量定義 // 定義簡單…

Qt輪廓分析設計+算法+避坑

輪廓分析擬合方面我現在只考慮矩形擬合和圓形擬合細分的話&#xff0c;橢圓擬合&#xff0c;矩形擬合&#xff0c;最小外接矩形&#xff0c;最小外接圓。對于一張圖像可能有不同的圖形&#xff0c;不同的圓&#xff0c;不同的矩形&#xff0c;我需要對其進行篩選&#xff0c;也…

C++中STL六大組件List的簡單介紹

一、前言C非常重視效率&#xff0c;對效率有損失的代碼常常是能省則省。使用list要包含的頭文件是<list>&#xff0c;要包含頭文件就是#iinclude <list>&#xff0c;List肯定是一種鏈表&#xff0c;我們不妨回憶一下那種鏈表插入刪除效率最快也就是最簡單&#xff…

第十五節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 - vue前端 生產部署

Vben Admin vben5 系列文章目錄 ?? 基礎篇 ? 第一節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 ? 第二節:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入門 - Python Flask 后端開發詳解(附源碼) ? 第三節:Vben Admin 最新 v5.0 (vben5) + Python …

背包初步(0-1背包、完全背包)

當月光灑在我的臉上 我想我就快變了模樣 有一種叫做撕心裂肺的湯 喝了它有神奇的力量 動態規劃初步&#xff08;完全背包&#xff09; 目錄動態規劃初步&#xff08;完全背包&#xff09;0-1背包簡介完全背包檢查數組是否存在有效劃分&#xff08;前綴劃分DP&#xff09;單詞拆…