【问题标题】:Profiling Android applications using ltrace使用 ltrace 分析 Android 应用程序
【发布时间】:2011-08-31 11:42:34
【问题描述】:

我需要分析 android 应用程序的动态库调用,并决定为此目的使用“ltrace”工具进行分析。我将“ltrace”工具合并到android包中,然后一起编译成功。它适用于 shell 程序,就像通​​常的 linux 控制台应用程序一样。

但是,我无法正确分析从“Zygote”进程派生的 Android 应用程序。我尝试将ltrace附加到“Zygote”进程以跟踪它的子进程,但我只收到SIGCHLD和SIGSTOP信号并异常终止,显示以下错误。

意外的指令 0xffffffff 在 0xffff0508

我只是想知道是否有人曾经在 android 系统上尝试过这种分析。任何短的 cmets 都对我很有帮助。

提前谢谢你。

【问题讨论】:

    标签: android profiling ltrace


    【解决方案1】:

    尝试将 ltrace 附加到你的 android 应用程序的进程后,它从 zygote 分叉出来。您将需要一个为 android 的仿生 libc 构建的 ltrace,以及一个可以合理处理线程的 ltrace。

    有一种方法可以设置一个可调试的 android 应用程序等待 java 调试器的连接,你可以使用它,连接 ltrace,然后连接和断开 java 调试器以重新启动它。这应该捕获您自己的大部分逻辑,但不是整个启动。

    IIRC 您处于连接并重新启动的时间限制,否则它可能会自行恢复以避免触发应用程序无响应的情况。

    您可能会通过使用 java 调试器了解正在发生的事情,然后阅读源代码以了解它是如何在本机端实现的。

    【讨论】:

    • 感谢您的回答,但我想从新流程的开始进行分析,而不是在执行过程中。这就是为什么我试图从'zygote'派生新进程的时间开始进行分析。而且似乎 java 调试器不是我的目的,因为我对分析外部本机动态库而不是 java 程序本身感兴趣。感谢您的评论。
    • java 调试器的目的只是在启动的早期停止程序,以便您可以附加 ltrace。
    • 你是对的。我可以使用 java 调试器在入口点设置断点。但我担心的是这种方法似乎只适用于有源代码的应用程序。您认为可以在我们没有源代码的应用程序入口处设置中断吗?再次感谢您非常有帮助的回答。
    【解决方案2】:

    先生。 Chris Stratton 的方法会奏效。

    LoadLibrary() 是调试 jni 的另一个要点。

    【讨论】: