用 jdb 追踪 Android (二)

2014-11-24 11:47:30 · 作者: · 浏览: 18
thodSubtypeListLocked(imi, allowsImplicitlySelectedSubtypes);

<12> android.server.ServerThread[1]

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 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

[java]
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";

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