使用ltrace对Android应用程序进行性能分析

3
我需要分析 Android 应用程序的动态库调用,并决定使用 "ltrace" 工具进行分析。我将 "ltrace" 工具合并到 Android 软件包中,然后成功编译。它在 shell 程序上像通常的 Linux 控制台应用程序一样正常工作。
然而,我无法正确地分析从 "Zygote" 进程分叉出来的 Android 应用程序。我尝试将 ltrace 附加到 "Zygote" 进程以跟踪其子进程,但是我只收到了 SIGCHLD 和 SIGSTOP 信号,并且异常终止,显示以下错误:
“0xffff0508 处有意外指令 0xffffffff。”
我想知道是否有人曾经在 Android 系统上尝试过这种分析。任何简短的评论对我都非常有帮助。
非常感谢。
2个回答

2
尝试在zygote分叉后将ltrace附加到您的Android应用程序进程上。您需要为Android的bionic libc构建一个ltrace,并且需要一个合理处理线程的ltrace。
有一种方法可以使可调试的Android应用程序等待Java调试器的连接,您可以使用此方法连接ltrace,然后连接和断开Java调试器以再次启动它。这应该可以捕获大部分自己的逻辑,但不包括整个启动过程。
如果您没有及时连接并重新启动它,可能会超时并自动恢复以避免触发“应用未响应”情况。
也许通过使用Java调试器查看正在发生的事情,然后阅读源代码以了解如何在本地端实现它,您可以学到更多东西。

谢谢您的回答,但我想从新进程开始进行分析,而不是在执行过程中。这就是为什么我试图从“zygote”分叉的时间开始进行分析。而且似乎Java调试器并不适合我的目的,因为我对外部本地动态库的分析更感兴趣,而不是Java程序本身。非常感谢您的评论。 - Honggyu Kim
Java调试器的目的仅是在启动程序时尽早停止它,以便您可以附加ltrace。 - Chris Stratton
你说得对。我可以使用Java调试器在入口点设置断点。但是我担心的是,这种方法似乎仅适用于具有源代码的应用程序。您认为是否可能在我们没有其源代码的应用程序的入口处设置断点?再次感谢您非常有帮助的答案。 - Honggyu Kim

0

克里斯·斯特拉顿先生的方法是可行的。

LoadLibrary() 是另一个可以用于调试jni的断点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接