不知道大家要不要经常在oncreate打断点,其实感觉可能没什么卵用。不过如果要调试一些在oncreate做的逻辑,可能还是需要的把。
1.有源码情况下
有源码情况就好搞啦,在oncreate中加一句代码就可以了。
import android.os.Debug;
Debug.waitForDebugger();
然后,点击应用启动,就会出现下面这个提示,他在等待调试器连接。
wait for debug
这时我们在Androidstudio中在oncreate设置一个断点,然后用DDMS连接上他,就会运行到断点处啦。
打断点
1.无源码情况下
方法一:动态调试smail
如果我们只有一个apk,那我们就反编译这个apk得到smail代码,然后在smail的oncreate代码处加入Debug.waitForDebugger()对应的smail代码即可。然后Android stduo可以动态调试smail代码。具体以后再详细说说。
方法二:jdb调试
1.设置com.example.anrdemo应用等待debug
adb shell am set-debug-app -w com.example.anrdemo
2.点击应用启动,会出现等待调试界面
wait for debug
3.adb转发端口,7600时端口号(确认该端口没被占用),31086是com.example.anrdemo的进程号。
adb forward tcp:7600 jdwp:31086
4.设置jdb脚本,让连接上手机后,先执行jdb脚本挂起所有的线程
echo suspend > jdb.ini
5.jdb连接手机(windows 和 linux命令不一样,下面的linux的)
jdb -attach localhost:7600
如下图,所有线程都挂起了。
挂起了
那挂在那里了呢?
其实是挂在ActivityThread的handleBindApplication方法的Debug.waitForDebugger()方法中,handleBindApplication是AMS binder连接应用的方法,在oncreate之前。
handleBindApplication
6.在oncreate打断点。
stop in com.example.anrdem.MainActivity.onCreate
可以看到断点成功如下
断点成功
点击next就可以单步运行了,更多命令可查看jdb的命令,可以查看变量,设置变量,查看线程堆栈等功能,其实ecplise的断点功能就是对jdb加了个壳而已。
next
网友评论