Android NDK远程调试:为什么gdb这么慢?

时间:2013-01-14 16:45:23

标签: android-ndk gdb remote-debugging

使用NDK r8c,Eclipse 4.2,Windows 7 64

我之前(在其他平台上,通过千兆以太网)使用了远程调试器,用于与本地调试没有区别的大型C ++代码库。 SDK附带的Java调试器也运行得很快。因此,我很困惑为什么gdb连接和跨越代码行的速度太慢。

在我目前的应用程序中,大约有20个静态库和1500个源文件,连接大约需要15秒,步骤大约需要2秒。我更关心踩踏。

有没有人曾经分析过gdb来看看问题是什么?如果有,有什么建议吗?

1 个答案:

答案 0 :(得分:3)

我有。虽然我的重点是共享库(符号加载性能和未决的符号解析),但是我和NVIDIA的同事已经为AOSP提供了几个提交来解决这个问题,我们加快了solib加载处理速度6倍。 (虽然在完成我们自己的工作之后,我们发现其中3x已经由GNU在7.5上游解决了...所以我们放弃了我们的重新发明,并将相关的7.5补丁提交到Google的NDK存储库,该存储库基于旧的7.3 GDB。)我相信我们所有的加速都出现在r8d ......但是我没有检查过。

我无法想到为什么静态库会减慢速度,但我必须承认我没有考虑过它们。您是否有充分理由相信这一点,或者只是评论您对调试需求的大小和范围的看法?

我们已经开始研究踩踏问题,但还没有任何东西要分享。基本上,瓶颈是ADB(尤其是在Windows上。)此外,在步进时,GDB和gdbserver之间存在大量繁琐的通信,尤其是当您使用具有本地窗口的IDE,注册窗口,表达式窗口,堆栈窗口等时。,每一步都更新。这可能是针对IDE用例进行优化的很多喋喋不休。

我们正在考虑加速步进的一些修复程序将特定于IDE:

  • 使用python脚本在GDB中预处理监视表达式,而不是在IDE中。

  • 实现在GDB和gdbserver之间进行通信的“超级数据包”...以最小化GDB和gdbserver之间的聊天的方式封装特定于IDE的通信的数据包。

我们打算与Android社区分享所有这些。