zoukankan      html  css  js  c++  java
  • 用 jdb 追踪 Android

    You may have debug Android in eclipse, Have you ever used jdb  tracing Android. Since Dalvikvm support jdwp, we can use jdb to debug the program.  there are 2 ways

    Android as debug host

    Steps

    1) update libandroid_runtime


    change below

    frameworks/base/core/jni/AndroidRuntime.cpp
        620     opt.optionString =
        621         "-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y";
    
    as
    
    opt.optionString = "-agentlib:jdwp=transport=dt_socket,address=8011,server=y,suspend=y";




    use "mmm frameworks/base/core/jni" to re-generate  system/lib/libandroid_runtime.so, then copy to your runing env (system/lib)

     

    2) change system/root/default.prop on your running env


    change "ro.debuggable=0" to "ro.debuggable=1"


    if you won not do it,  you can specify  AndroidManifest.xml

    <application android:label="@string/app_name" android:icon="@drawable/plasma" android:debuggable="true">

    Or the App can not be debugged


    3) start the app


    check stop you will see below

    I/Zygote  ( 6843/6843): Accepting command socket connections
    
    I/jdwp    ( 7385/7385): JDWP will wait for debugger on port 8011
    



    4) use jdb to attach the port


    jdb -attach localhost:8011

    --- you will see ---

    Initializing jdb ...
    >
    VM Started: "thread=<1> main", dalvik.system.Zygote.nativeForkSystemServer(), line=-1 bci=-1
    
    <1> main[1]




     

    5)  include source dirs by "use" command, you will see source code


    <1> main[1]  use  /home/user/jb/frameworks/base/core/java:/home/user/jb/frameworks/base/packages/SettingsProvider/src/:/home/user/jb/frameworks/base/services/java

     
    6) set break and trace

    Use commands: stop in, cont, list, next, you will able to trace your code
    
    <1> main[1] stop in com.android.server.InputMethodManagerService.getEnabledInputMethodSubtypeList
    
    Deferring breakpoint com.android.server.InputMethodManagerService.getEnabledInputMethodSubtypeList.
    
    <1> main[1] cont
    
    > Ignoring cmd 268435570/199/1 from the VM
    
    Set deferred breakpoint com.android.server.InputMethodManagerService.getEnabledInputMethodSubtypeList
    
    Breakpoint hit: "thread=<12> android.server.ServerThread", com.android.server.InputMethodManagerService.getEnabledInputMethodSubtypeList(), line=845 bci=0
    
    845            synchronized (mMethodMap) {
    
     
    
    <12> android.server.ServerThread[1] list
    
    841    
    
    842        @Override
    
    843        public List<InputMethodSubtype> getEnabledInputMethodSubtypeList(InputMethodInfo imi,
    
    844                boolean allowsImplicitlySelectedSubtypes) {
    
    845 =>         synchronized (mMethodMap) {
    
    846                return getEnabledInputMethodSubtypeListLocked(imi, allowsImplicitlySelectedSubtypes);
    
    847            }
    
    848        }
    
    849    
    
    850        @Override
    
    <12> android.server.ServerThread[1] next
    
    Step completed: "thread=<12> android.server.ServerThread", com.android.server.InputMethodManagerService.getEnabledInputMethodSubtypeList(), line=846 bci=3
    
    846                return getEnabledInputMethodSubtypeListLocked(imi, allowsImplicitlySelectedSubtypes);
    
    <12> android.server.ServerThread[1]


    Jdb as debug host

    There are shortcomings in "Android as host", because every time the JavaVM starts up,  it will move to listen status, So the SystemServer will listen, even we don't want to. so "Jdb as debug host" is a better idea.


    1) update libandroid_runtime


    change below

    frameworks/base/core/jni/AndroidRuntime.cpp
        620     opt.optionString =
        621         "-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y";
    
    as
    
    opt.optionString = "-agentlib:jdwp=transport=dt_socket,address=localhost:8011,server=n,suspend=y";



    if you won't run jdb on the same host, change "localhost" to other host/ip

    2) change system/root/default.prop on your running env

    change "ro.debuggable=0" to "ro.debuggable=1"

    3) use jdb to listen the port

    jdb -listen 8011

    4) Start Android or APPs


    when your Dalvik VM start,  it will connect 8011

    The good advantages of "Jdb as Host" is that when you need to debug, you let jdb listen; if you won't listen, Android will run as normal.

    For example, when I want to debug  the App, I run "jdb -listen 8011", then I click the App icon on the Launcher and start to debug.

    Attention:

    The Apps have launch timeout limits or It will be terminated by AM, when you enter jdb console, you need to quickly set breakpoint, and enter "cont" to run

     

  • 相关阅读:
    HDU 1882 Strange Billboard(位运算)
    Codeforces Round #243 (Div. 2) A~C
    Codeforces Round #242 (Div. 2) A~C
    2014 微软 编程之美初赛第一场 题目3 : 活动中心
    2014年微软编程之美初赛第一场 第二题 树
    POJ 2318 TOYS && POJ 2398 Toy Storage(几何)
    Coder-Strike 2014
    POJ 1269 Intersecting Lines(几何)
    HDU 1883 Phone Cell (圆覆盖最多点)
    HDU 1429 胜利大逃亡(续)(三维BFS)
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3003946.html
Copyright © 2011-2022 走看看