Android Framework 調用棧

在Android Framework開發中,添加調用棧(Call Stack)是調試復雜問題(如崩潰、死鎖或流程追蹤)的核心手段。

一、Java層調用棧添加

適用于Activity、Service等組件或Framework中的Java代碼。

  1. 基礎方法
    使用Log類捕獲當前調用路徑:

    Log.d("TAG", "Current stack:", new Exception("Debug Stack"));
    // 或精簡版:
    Log.i("TAG", Log.getStackTraceString(new Throwable()));
    

    日志會輸出從當前點回溯的完整調用鏈,包含類名、方法名及行號。

  2. 高級場景

    • 被動回調追蹤:在onCreate()等生命周期方法中插入,追蹤系統觸發的調用來源。
    • 異步線程調試:在Runnable或Handler回調中打印,定位線程切換問題。

二、Native層調用棧添加(C/C++)

適用于HAL、JNI或系統服務等底層模塊。

  1. 使用CallStack類(需鏈接libutils):

    #include <utils/CallStack.h>
    void debugNativeStack() {android::CallStack stack("NATIVE_TAG");stack.update();  // 捕獲當前棧stack.dump("");  // 輸出到logcat
    }
    

    依賴配置(Android.mk或Android.bp):

    LOCAL_SHARED_LIBRARIES += libutils
    LOCAL_CFLAGS += -D_ARM_  # 可選,指定架構
    

    注意:Android 8.0+需用libutilscallstack替代舊版libcutils

  2. 符號表與解析工具

    • 編譯時保留符號表:確保編譯生成帶調試符號的.so文件(Android源碼編譯默認生成于out/.../symbols/)。
    • 崩潰日志解析
      arm-eabi-addr2line -e <帶符號的.so文件> <崩潰地址>  # 例如00009124
      
      或使用ndk-stack工具自動化解析logcat崩潰日志。

三、內核層調用棧添加

適用于驅動或內核模塊調試。

  1. 簡單打印
    插入WARN_ON(1);,觸發內核警告并輸出調用棧。
  2. 查看進程內核棧
    adb shell cat /proc/<pid>/task/<tid>/stack
    
    需Root權限,且內核需啟用CONFIG_STACKTRACE

四、優化實踐與調試技巧

  1. 動態捕獲(不修改代碼)
    • Java進程adb shell kill -3 <pid> 觸發VM保存棧到logcat。
    • Native進程adb shell debuggerd -b <pid> 導出當前所有線程調用棧。
  2. 回退棧(Back Stack)管理
    在Fragment事務中,addToBackStack("tag")可記錄界面跳轉鏈,通過popBackStack()回溯。

五、 總結:各層核心實現方案

層級核心方法關鍵配置/工具
Java層Log.getStackTraceString(new Throwable())無依賴,直接嵌入代碼
Native層android::CallStack::dump()鏈接libutils,保留符號表
內核層WARN_ON(1)/proc/pid/stack內核配置CONFIG_STACKTRACE
動態捕獲kill -3debuggerd -b無需編譯,實時調試

?? 符號表是關鍵:Native崩潰分析必須使用帶調試符號的.so文件(路徑通常為out/target/product/xxx/symbols/)。

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

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

相關文章

Ollama安裝非系統盤操作方法(2025年6月測試通過)

Ollama是當前部署大模型比較便利的工具&#xff0c;但是默認會將軟件和模型都安裝到C盤下&#xff0c;導致系統盤爆表&#xff0c;建議將軟件和模型都放置在非系統盤。 1. 軟件安裝在非系統盤 &#xff08;1&#xff09;在D盤下手動創建ollama目錄 &#xff08;2&#xff09…

《HTTP權威指南》 第1-2章 HTTP和URL基礎

HTTP請求基礎 格式化數據塊稱為HTTP報文 請求報文&#xff1a;從客戶端發往服務器的HTTP報文&#xff0c;只有請求起始行請求首部&#xff0c;沒有請求主體 響應報文&#xff1a;從服務器發往客戶端的報文&#xff0c;包含響應起始行響應首部響應主體 HTTP報文通過傳輸控制…

9. TypeScript 泛型

TypeScript 中的泛型使開發者能夠編寫靈活、可重用的代碼&#xff0c;同時保持類型安全。它們允許動態定義類型&#xff0c;確保函數、類和接口可以適用于任何數據類型。這有助于避免重復&#xff0c;提高代碼的模塊化&#xff0c;使其既類型安全又具備適應性。 一、認識泛型 …

Apache Iceberg與Hive集成:分區表篇

一、Iceberg分區表核心概念與Hive集成原理 1.1 分區表在大數據場景的價值 在大規模數據分析中&#xff0c;分區表通過將數據按特定維度&#xff08;如時間、地域、業務類型&#xff09;劃分存儲&#xff0c;可顯著提升查詢效率。Apache Iceberg的分區表設計融合了Hive的分區理…

SAST + IAST + DAST 全鏈路防護體系構建方案

&#x1f525;「炎碼工坊」技術彈藥已裝填&#xff01; 點擊關注 → 解鎖工業級干貨【工具實測|項目避坑|源碼燃燒指南】 1. 生命周期分層嵌入&#xff08;防御縱深&#xff09; 階段工具防護重點集成觸發點編碼階段SAST源碼漏洞&#xff08;硬編碼密鑰、SQL注入模式&#x…

pnpm link如何不踩坑

前提一&#xff1a;我有一個source-project源碼庫&#xff0c;有一個develop-project項目庫。想使用pnpm link對source-project進行本地調試。 前提二&#xff1a;source-project源碼庫已打包 本地調試詳細步驟如下&#xff1a; 1、檢查是否配置了系統環境變量&#xff0c;P…

vue3 javascript 多字段求和技巧

在 Vue 3 中&#xff0c;如果你需要在一個組件中處理多個字段的求和&#xff0c;你可以通過計算屬性&#xff08;computed properties&#xff09;或者方法&#xff08;methods&#xff09;來實現。這里我將展示兩種主要的方法&#xff1a; 方法 1&#xff1a;使用計算屬性&am…

【LeetCode】每日一題 —— No.3405

LeetCode 3405 統計恰好有 K 個相等相鄰元素的數組數目&#xff08;DP 構造型&#xff09; 題目概述 我們需要統計長度為 n 的數組 arr 滿足如下條件的方案數&#xff1a; 每個元素在區間 [1, m] 之間恰好存在 k 個位置 i (1 ≤ i < n) 滿足 arr[i] arr[i - 1] 也就是說…

Elsa Workflows: .NET 的開源工作流引擎簡介

文章目錄 Elsa Workflows&#xff1a; .NET 的開源工作流引擎核心定位與理念關鍵特性與優勢當前 (Elsa 3) 的已知限制/待完善項總結 Elsa Workflows&#xff1a; .NET 的開源工作流引擎 Elsa Workflows 是一個開源的、模塊化的 .NET 庫集合&#xff0c;旨在為 .NET 應用程序提…

linux虛擬機yum命令報錯解決方案

問題 假如出現了這樣的問題&#xff0c;可能是虛擬機yum庫存在問題 解決方法 1、打開cmd&#xff0c;輸入ssh root地址&#xff0c;比如ssh root192.168.222..111&#xff0c;選yes&#xff0c;輸入虛擬機密碼 2、使用yum repolist,查看倉庫狀態&#xff0c;status下面如果是…

C++ 第一階段 基本語法 - 第一節:變量與數據類型詳解

目錄 一、變量與數據類型概述 1.1 什么是變量&#xff1f; 1.2 數據類型分類 二、基本數據類型詳解 2.1 整型&#xff08;int, short, long&#xff09; 2.1.1 常見整型類型 2.1.2 代碼示例 2.1.3 注意事項 2.2 浮點型&#xff08;float, double&#xff09; 2.2.1 浮…

CppCon 2017 學習:CNL: A Compositional Numeric Library

你說的這段關于浮點數的問題總結得很精準&#xff0c;我幫你整理一下&#xff0c;讓理解更清晰&#xff1a; The Problem with Floating-Point&#xff08;浮點數的問題&#xff09; 復雜的表示結構 浮點數由符號位 &#xff0c;有效數&#xff08;significand/mantissa&…

linux基礎重定向及組合重定向

一、基礎重定向操作符 ?類別? ?操作符? ?含義? ?示例? ?備注? ?標準輸出? > 覆蓋寫入 stdout 到文件 ls > file.txt 文件不存在則創建&#xff0c;存在則清空內容 >> 追加 stdout 到文件末尾 date >> log.txt 保留原有內容 ?標準…

佰力博科技與您探討鐵電分析儀適用場景

鐵電分析儀是一種用于測試和研究鐵電材料性能的精密儀器&#xff0c;其適用場景非常廣泛&#xff0c;涵蓋了材料科學、物理學、電子工程等多個領域。 1、材料科學與工程 鐵電分析儀廣泛應用于鐵電材料的研究&#xff0c;包括薄膜、厚膜、塊體材料以及電子陶瓷等。它能夠測試材料…

JVM 內存模型與垃圾回收機制全解析:架構、算法、調優實踐

Java 作為一門面向對象的編程語言&#xff0c;其核心優勢之一是 “一次編寫&#xff0c;到處運行” 的跨平臺特性。這一特性背后&#xff0c;Java 虛擬機&#xff08;JVM&#xff09;扮演著至關重要的角色。JVM 不僅負責解釋執行字節碼&#xff0c;還通過內存管理和垃圾回收機制…

自然語言處理相關基本概念

基本概念章節總結 一、語言學&#xff08;Linguistics&#xff09; 定義 研究語言的本質、結構和發展規律的科學&#xff0c;涵蓋語音、文字、語法等屬性。分支包括歷時語言學、共時語言學、描述語言學等。 核心內容 分析語言的形態、句法、語義等層面&#xff0c;如詞素&…

Vue購物車應用實現教程

文章目錄 1. 項目介紹2. 開發環境準備3. 設計購物車界面4. 創建Vue實例和數據模型5. 實現購物車功能5.1 從本地存儲加載數據5.2 監聽數據變化保存到本地存儲5.3 實現全選/反選功能5.4 計算選中商品的總價和總數量5.5 實現修改商品數量功能5.6 實現刪除商品功能5.7 實現結算功能…

雙因子認證如何讓Windows系統登錄更安全?SLA操作系統雙因素認證解決方案深度解析

引言&#xff1a;數字化轉型下的身份認證危機 在云計算與遠程辦公普及的2025年&#xff0c;企業信息系統正面臨前所未有的安全挑戰。微軟Azure Virtual Desktop漏洞事件、Citrix數據泄露等安全事件頻發&#xff0c;暴露出傳統密碼認證體系的致命缺陷。據《2025年云安全威脅報告…

FPGA基礎 -- Verilog語言要素之值集合

一、Verilog 值集合&#xff08;Value Set&#xff09; Verilog 是一種面向硬件建模的描述語言&#xff0c;為了更真實地模擬硬件行為&#xff0c;它并不僅僅像 C 語言那樣只有 0 和 1 兩種值&#xff0c;而是采用了四值邏輯&#xff08;Four-valued logic system&#xff09;…

開源一個芯片自由的脫機下載器

一、什么是脫機下載器 簡單來說&#xff0c;脫機下載器就是在不連接電腦、不用專業軟件的情況下&#xff0c;也能幫你把程序燒錄進芯片的工具。只要插上電源、按個按鈕&#xff0c;固件就自動下載進 MCU&#xff0c;非常適合量產、售后、維修等場景。 二、芯片自由的背后&…