Android 調試技術

來源:互聯網
上載者:User
文章目錄
  • 1. 在指定的函數內列印相關java調用
  • 2. 普通JAVA進程堆棧
  • 3. 核心進程堆棧
  • 4. 出異常時列印當前堆棧
  • 5. 輸出指定進程的堆棧
  • 1. CallStack
  • 1. 列印指定JAVA進程的堆棧到檔案中
  • 2. 列印指定進程的堆棧到Logcat
  • 3. 列印指定進程的系統調用
Android 調試技術by bob一、JAVA層單步調試

參見“用eclipse單步調試Laucher”
參見“用eclipse編譯調試adnroid的Browser”

二、Native層單步調試

參見“使用GDB 單步調試Android本地代碼”

三、JAVA層堆棧列印1. 在指定的函數內列印相關java調用
Log.d(TAG,Log.getStackTraceString(new Throwable()));
2. 普通JAVA進程堆棧
ActivityManagerService.dumpStackTraces

儲存在系統設定dalvik.vm.stack-trace-file指定的檔案data/anr/traces.txt中。可以包含多個進程堆棧資訊。

3. 核心進程堆棧

dumpKernelStackTraces,該函數為私人函數,不可調用。
代碼在frameworks/base/services/java/com/android/server/Watchdog.java
儲存在系統設定dalvik.vm.stack-trace-file指定的檔案data/anr/traces.txt中。

4. 出異常時列印當前堆棧

Exception::printStackTrace()

try {  ... } catch (RemoteException e) {   e.printStackTrace();   ... }
5. 輸出指定進程的堆棧
Process.sendSignal(pid, Process.SIGNAL_QUIT)

儲存在data/anr/traces.txt。
這個只對java進程有效,由dalvikvm的SignalCatcher.c處理。

四、Native層堆棧列印1. CallStack

使用方式:

#include <utils/CallStack.h> ... CallStack stack; stack.update(); stack.dump("");  // the parameter is prefix of dump

在使用之前需要修改system/core/include/arch/linux-arm/AndroidConfig.h

#define HAVE_DLADDR 1 #define HAVE_CXXABI 1

並在檔案frameworks/base/libs/utils/Android.mk中大約105行(LOCAL_SHARED_LIBRARIES)後添加

ifeq ($(TARGET_OS),linux) LOCAL_SHARED_LIBRARIES += libdl endif

重新編譯,push產生的libutils.so到/system/lib/目錄下,重啟裝置。

五、JAVA異常分析

這個android會輸出資訊到logcat。容易分析。

六、Natvie異常分析

native進程異常會導致
debuggerd會輸出資訊到logcat並儲存到/data/tombstones。
可以修改system/core/debuggerd/debuggerd.c中dump_stack_and_code的代碼滿足更深的調試資訊需求。

七、日誌Log系統

在java中使用

import android.util.Log; ... Log.d(TAG,"log info");

在Native代碼中使用

#define LOG_TAG "YOUR_LOGTAG" ... #include <utils/Log.h> #define LOG_NDEBUG 0 ... LOGD("log info");

或者

Log.d(LOG_TAG,“log info”);

使用adb logcat時可以只顯示特定類別的LOG,還可以通過參數 -v threadtime 顯示線程號及時間資訊。
普通標準輸出轉為Logcat

#system/bin/logwrapper 進程名
八、其他調試手段(命令列)1. 列印指定JAVA進程的堆棧到檔案中
#kill -3 pid

這裡的3就是3.5節的Process.SIGNAL_QUIT。
輸出在data/anr/traces.txt檔案中。
這個只對java進程有效,由dalvikvm處理。

2. 列印指定進程的堆棧到Logcat
#kill -11 pid 或者 #kill -7 pid

這個有時有效。其原理是利用了(六)節的機制。
可以用adb logcat看堆棧調用輸出。

3. 列印指定進程的系統調用
#strace -f -p pid -o output

主要輸出檔案、SOCKET、鎖等系統操作的資訊。
-f表示跟蹤所有子進程.
-o輸出log到指定檔案,可不用。

原文連結:

http://www.bobbog.com/archives/19

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.