2

我想用 GDB 在 Android 上调试一个应用程序,我可以用 gdb 和进程号连接它,但我想从一开始就看看它做了什么。

有没有办法做到这一点?

4

2 回答 2

4

在有根设备或模拟器上,您可能能够将 gdb 附加到 zygote 并在新分叉的进程即将假定正在启动的应用程序身份的位置放置一个断点。

如果您修改 zygote 以等待调试器附加,这可能是最简单的。我相信 Jdwp 调试系统中有类似的东西可以让你在启动该代码的早期进入 Java 调试器,但我不知道已经内置的 gdb 有什么可比的。虽然我想你可以让它等待对于 jdwp,并在附加(然后分离)java 调试器之前附加 gdb。

更新:我尝试了这个,通过使用 gdb 附加到 zygote 并修改一个单词的代码,该代码将由孩子早期执行以进入无限循环,然后从 zygote 分离。我想我会在新孩子出现在“ps”中时立即对其进行 gdb 并恢复它以便它可以继续。问题是孩子被杀死(可能是因为没有反应)比我输入所有命令的速度要快。所以它必须由一个程序来完成。如果不停下来杀死它,你可能看不到那么多东西——我的意思是你可能会在那里找到一个 strace,但是你希望从阅读源代码中学到什么?

于 2011-05-06T02:59:59.747 回答
2

OMAPpedia 的Android 调试页面对使用 gdbclient 有很好的概述。

gdbclient <executable name> <port number> <task name>
  • 可执行文件名: system/bin 目录中的文件名
  • 端口号:默认为:5039(数字前需要冒号)
  • 任务名称:在目标上运行“ps”获得。GDB 使用它在内部识别 PID。

您可能需要先设置一个端口转发adb,如下所示:

adb forward tcp:5039 tcp:5039
于 2011-05-06T04:36:59.520 回答