java 安卓调试_【转】Android 调试技术
一、JAVA層單步調試
二、Native層單步調試
三、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 ... 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 #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到指定文件,可不用。
總結
以上是生活随笔為你收集整理的java 安卓调试_【转】Android 调试技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: # 定义四边形_【四边形系列专题】 特
- 下一篇: ftp服务器文件名存在,有什么办法根据已