gpt4 book ai didi

android - 在 Android 上的 NDK 库中使用 Clang 地址清理器

转载 作者:搜寻专家 更新时间:2023-11-01 09:30:51 26 4
gpt4 key购买 nike

NDK 能够通过添加 -fsanitize=address 来为您使用它构建的任何内容启用地址清理器。标记为LOCAL_CFLAGSLOCAL_LDFLAGS , 这很好。好吧,如果它真的有效,那就太好了。如果您添加该标志并尝试构建您的库,您会收到一堆“ undefined symbol ”错误。您可以通过传递 -Wl,--unresolved-symbols=ignore 来忽略这些错误到链接器,构建成功完成,当然,冒险并没有就此结束。

Google's guide然后说您需要一个 root 设备,在该设备上运行一个脚本,该脚本修改系统分区上的运行时可执行文件,以便它加载 ASan 库,然后在运行时链接上述缺失的符号。我试过了,这种方法的主要问题是它还在 JVM 本身中分析了一些东西,从而减慢了它的速度,以至于应用程序根本无法启动或在 JVM 内的某个地方崩溃。

我还尝试了新的 malloc debug在模拟器上,但它也会调试整个 JVM,从而使其无法使用。所有这些工具似乎绝对不是为应用程序开发人员设计的,而是为那些在 Android 上工作的人设计的。

我迫切需要一种方法来修复我的应用程序中的内存损坏崩溃,而无需分析过程中的整个虚拟机。如果我只是将 ASan 的库放入我的 apk 并在我的 JNI 库之前加载它,ASan 会工作吗?还有其他方法可以调试吗?人们是如何修复 Android 上的此类错误的?

制作一个“最小包装器可执行文件”并在其他具有适当调试工具的操作系统上运行它并不是真正的选择,因为 JNI 库的使用方式在很大程度上取决于 Java 部分,即使我做了第一,我不能完全确定这个错误会重现。

更新:我尝试了 asan_device_setup Oreo 模拟器上的脚本,因为这次它在带有 Nougat 的 Nexus 9 上根本不起作用。日志中充斥着 32 位进程尝试加载 64 位库的链接器错误,然后它卡住了,使其再次可用的唯一方法是刷新出厂镜像。为了确保我没有搞砸任何事情,我尝试了几次重新刷新出厂镜像,然后是 TWRP,而不是 SuperSU,然后使用“adbd insecure”应用程序以 root 身份重新启动 adb 守护程序。所以,我用 -writable-system 启动了模拟器并在其上运行脚本,它成功完成。然后我用 ASAN 构建了我的应用程序并安装了它,但它因 java.lang.UnsatisfiedLinkError: dlopen failed: cannot locate symbol "__asan_init_v3" referenced by "/data/...full path to the shared library 而崩溃发射时。我在有和没有 setprop wrap.com.app.package "asanwrapper" 的情况下都试过了,结果是一样的。

最佳答案

如果您看到如此严重的性能问题,您可能应该提交错误 (http://b.android.com)。我们每天运行的设备都完全采用 ASAN 检测,而且它们的运行效果比您预期的要好。 ASAN 的速度大约是原来的 2 倍,但使用 ASAN 运行您的应用应该可以正常工作。

调试 malloc 也是如此(我不记得调试 malloc 对性能的影响,但我认为它们没有 ASAN 严重)。

关于android - 在 Android 上的 NDK 库中使用 Clang 地址清理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47560028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com