尝试用android studio调试zygote进程

一般都是调试system_process进程,同时也是as显示的唯一系统进程,而我就是想调试下zygote进程,结果折腾好久(用as源码调试)。我这里是修改源码在zygote fork进程的时候主动等待调试器。
系统版本4.4.4,修改的文件是:

/home/haidragon/Desktop/android/libcore/dalvik/src/main/java/dalvik/system/Zygote.java

......................................
    public static boolean systemInSafeMode = false;

    private Zygote() {}
//-----------------------haidragon-----------------------//
     private static volatile boolean mWaiting = false;
    public static boolean isDebuggerConnected() {
        return VMDebug.isDebuggerConnected();
    }
    public static void waitForDebugger() {
        if (!VMDebug.isDebuggingEnabled()) {
            //System.out.println("debugging not enabled, not waiting");
            return;
        }
        if (isDebuggerConnected())
            return;

        // if DDMS is listening, inform them of our plight
        System.out.println("Sending WAIT chunk");
        //byte[] data = new byte[] { 0 };     // 0 == "waiting for debugger"
        //Chunk waitChunk = new Chunk(ChunkHandler.type("WAIT"), data, 0, 1);
        //DdmServer.sendChunk(waitChunk);

        mWaiting = true;
        while (!isDebuggerConnected()) {
            try { Thread.sleep(200); }
            catch (InterruptedException ie) {}
        }
        mWaiting = false;

        System.out.println("Debugger has connected");

        /*
         * There is no "ready to go" signal from the debugger, and we‘re
         * not allowed to suspend ourselves -- the debugger expects us to
         * be running happily, and gets confused if we aren‘t.  We need to
         * allow the debugger a chance to set breakpoints before we start
         * running again.
         *
         * Sit and spin until the debugger has been idle for a short while.
         */
        while (true) {
            long delta = VMDebug.lastDebuggerActivity();
            if (delta < 0) {
                System.out.println("debugger detached?");
                break;
            }

            if (delta < 1300) {
                System.out.println("waiting for debugger to settle...");
                try { Thread.sleep(200); }
                catch (InterruptedException ie) {}
            } else {
                System.out.println("debugger has settled (" + delta + ")");
                break;
            }
        }
    }
//-----------------------haidragon-----------------------//
    private static int i=0;
    private static void preFork() {
        i++;
        if(i>3){
       waitForDebugger();
    }
        Daemons.stop();
        waitUntilAllThreadsStopped();
    }
        ......................................
因为这里是不能用android.os.Debug.waitForDebugger()的,因为没有android.os.debug包。
但是我们可以去看这个实现。发现在4.4.4中它实现就是在 ‘/home/haidragon/Desktop/android/libcore/dalvik/src/main/java/dalvik/system/VMDebug.java‘ 内。通过‘/home/haidragon/Desktop/android/frameworks/base/core/java/android/os/Debug.java‘ 这个类调用的。


其它系统不一样我看了5系统以上dalvik/system目录的东西移动到art的runtime里面去了。
到这里我们重新生成system.img刷入手机。他就会创建三个进程后等待调试器连接。

手机就会一直卡死在那。

然后就是找不到zygote进程,我进手机里看端口附加也没用。原因应该是zygote本身是一个cpp层的执行程序吧(app_process)先写这里。后面还是用 gdb/gdbserver 附加方式调试吧。我这是折腾下as。

原文地址:https://blog.51cto.com/haidragon/2416769

时间: 2024-11-05 11:51:11

尝试用android studio调试zygote进程的相关文章

Android Studio 调试过程中快捷查看断点处变量值(Ctrl+Shift+I无效)?

当你在做Keymap到Eclipse后,在debug过程中,在Eclipse中我们很喜欢用Ctrl+Shift+I去查看一个运算或者调用的结果,这样用起来很方便.但是keymap到Eclipse后,你会发现这个快捷键不能使了.啥原因呢,原因我们一个个排除: 1.是否快捷键映射失败, 2.映射成功了,你看了快捷键也发现是正常的,那就再查看是否快捷键冲突. 3.如何是快捷键冲突,那解决快捷键冲突,正常来说解决了冲突后,快捷键是能正常使用的,但是你会发现即使你解决了冲突,Ctrl+Shift+I还是不

Android Studio 调试技巧

转载自: http://tianweishu.com/2015/12/21/Android-studio-debug-tips-you-may-not-know/ 写代码不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug:那么你的调试技术停留在哪一阶段呢?仅仅是下个断点单步执行吗?或者你知道 Evaluate Expression, 知道条件断点:可是你听说过日志断点吗,Method Breakpoint, Exception Breakpoint 呢?还有高大上的 Field

你所不知道的Android Studio调试技巧

转载:http://www.jianshu.com/p/011eb88f4e0d Android Studio目前已经成为开发Android的主要工具,用熟了可谓相当顺手.作为开发者,调试并发现bug,进而解决,可是我们的看家本领.正所谓,工欲善其事必先利其器,和其他开发工具一样,如Eclipse.Idea,Android Studio也为我们提供了强大的调试技巧,今天我们就来看看Android Studio中有关调试的技巧. 首先,来看看Android studio中为我们提供的调试面板(标准

Android调试系列—使用android studio调试smali代码

1.工具介绍 使用工具 android killer:用于反编译apk包,得到smali代码 android studio:调试smali代码工具,或者使用idea,android studio就是在idea的基础上修改的 smalidea-0.03.zip:  as插件,需要安装到android studio中 , 下载地址 模拟器或者或者真机:运行要调试的程序 样本:使用网络上的某apk程序,  下载地址 2.前期准备 2.1  手机或者模拟器安装应用 adb instll GGNdkTes

Android开发工具----Android Studio调试技巧

0.前言 Android Studio目前已经成为开发Android的主要工具,作为开发者,调试.发现并解决BUG是家常便饭.正所谓,工欲善其事必先利其器,今天我们就来看看Android Studio中的调试技巧. 1.调试面板 首先,来看看Android studio中为我们提供的调试面板(标准情况下): 点击右上角Restore 'Threads'View可先展示目前相关的线程信息: 2.单步调试区 2.1 Show Execution Point 点击该按钮,光标将定位到当前正在调试的位置

用 天天模拟器 + Eclipse或Android Studio调试app

Android开发人员都知道,原生的模拟器启动比较慢,操作起来也不流畅,当然很多人都会选择直接使用android手机来开发,但是有时候需要在投影仪上演示程序的时候手机不太好实现.所以很多人选择使用genymotion,但是genymotion配置又过于繁琐, 所以给大家推荐一款基于genymotion的模拟器-天天模拟器. 旧版本的天天模拟器可以直接用于调试,但是由于新版本的天大模拟器端口号被修改为6555,要想用天天连接IDE开发,需要使用ADB命令进行连接. 如没配置SDK环境变量, 进入c

使用Android Studio调试内存问题

http://blog.csdn.net/yutao52shi/article/details/50055669 前言 内存问题对于Android开发者是永远的痛.如果一个android程序员说他没有遇到过OutOfMemory,那只能说他绝对不是做Android的.以往在ADT年代,都是使用eclipse的Mat(http://www.eclipse.org/mat/)插件来做内存分析.在使用了Android Studio开发后,发现AS不仅带来了不少编码上的便利,同时还带来了很多有用的工具.

Android Studio 调试vivo x9

θvivo手机由于安全机制繁琐,在进行软件调试时会经常出现问题,下面说一下解决方案: 一.关闭Android Studio快速运行(Instant Run)功能; vivo手机由于存在安全检测,所以是不会同意快速运行功能的; 在Android Studio==>Setting==>Instant Run里取消 Enable Instant Run to hot swap... 的打勾; 二.在vivo手机的开发者选项中勾选通过USB验证应用,并 选择调试应用,勾选你正在调试的程序; 这样一来就

Android Studio 调试快捷键

一直在用微软的东西,用 Android Studio 开发还是太坑了.网上很多人说调试快捷竟然都是错的,不知道是不是不同版本不一样. Android Studio 3.2 快捷键如下: F7:进入当前方法内部.F8:单步调试执行.F9:运行到下一个断点. 代码写得久了,调试也就只需要用到这三个了.备忘一下,不经常用 Android Studio. 原文地址:https://www.cnblogs.com/nanfei/p/9764627.html