使用 NDK r8c、Eclipse 4.2、Windows 7 64
我之前使用过远程调试器(在其他平台上,通过千兆以太网)用于大型 C++ 代码库,感觉与本地调试没有什么不同。SDK 附带的 Java 调试器运行速度也很快。因此,我很困惑为什么 gdb 连接和跨行代码的速度如此之慢。
在我当前的应用程序中,大约有 20 个静态库和 1500 个源文件,连接大约需要 15 秒,步进大约需要 2 秒。我更担心踩踏。
有没有人分析过 gdb 以查看问题所在?如果是这样,有什么建议吗?
使用 NDK r8c、Eclipse 4.2、Windows 7 64
我之前使用过远程调试器(在其他平台上,通过千兆以太网)用于大型 C++ 代码库,感觉与本地调试没有什么不同。SDK 附带的 Java 调试器运行速度也很快。因此,我很困惑为什么 gdb 连接和跨行代码的速度如此之慢。
在我当前的应用程序中,大约有 20 个静态库和 1500 个源文件,连接大约需要 15 秒,步进大约需要 2 秒。我更担心踩踏。
有没有人分析过 gdb 以查看问题所在?如果是这样,有什么建议吗?
我有。我和我在 NVIDIA 的同事已经为 AOSP 做出了一些贡献来解决这个问题,尽管我们的重点一直是共享库(符号加载性能和待处理的符号解析)。我们已经将 solib 加载处理速度提高了 6 倍。(虽然,在完成我们自己的工作之后,我们发现 GNU 在 7.5 中已经在上游解决了 6x 中的 3x ......所以我们放弃了重新发明,并将相关的 7.5 补丁提交到 Google 的 NDK 存储库,该存储库基于较旧的 7.3 GDB。)我相信我们所有的加速都存在于 r8d 中......但我没有检查过。
我想不出静态库会减慢速度的任何原因,但我必须承认我没有考虑过它们。您是否有特定的理由相信这一点,或者这只是为了说明您的调试需求的规模和范围而发表的评论?
我们已经开始研究步进问题,但还没有任何东西可以分享。基本上,瓶颈是 ADB(尤其是在 Windows 上)。此外,在单步执行时,GDB 和 gdbserver 之间有很多闲聊,尤其是当您使用带有本地窗口、注册窗口、表达式窗口、堆栈窗口等的 IDE 时.,每一步都更新。这是很多可能会针对 IDE 用例进行优化的喋喋不休。
我们正在考虑的一些用于加速步进的修复将是特定于 IDE 的:
使用 python 脚本在 GDB 中预处理监视表达式,而不是在 IDE 中。
实现 GDB 和 gdbserver 之间的“超级数据包”通信... 封装特定于 IDE 的通信的数据包,以最大限度地减少 GDB 和 gdbserver 之间的干扰。
我们打算与 Android 社区分享所有这些。