无法打开 malloc 调试?

Can't get malloc debug to turn on?

我正在尝试为我的 android 应用程序启用 malloc 调试,但我一直无法让它工作。

我的 wrap.sh 个脚本都包含:

#!/system/bin/sh
LIBC_DEBUG_MALLOC_OPTIONS="free-track verbose"
logwrapper "$@"

并且我设置了以下目录结构:

当我用 grep logcat 获取 "malloc debug enabled" 时,我什么也没得到。

如果我将 wrap.sh 脚本内容更改为此

#!/system/bin/sh
LIBC_DEBUG_MALLOC_OPTIONS=free-track logwrapper "$@"

这正是 the documentation for the wrap shell script 所说的要添加的内容(尽管对我来说这似乎是无效的 shell 脚本语法),我可以看到 "malloc debug enabled" 日志消息,但我的应用程序冻结了在初始屏幕上,从未真正启动。

我不确定发生了什么,希望任何类型的输入。

其他说明:

那是 运行 Android 上的可执行二进制文件。我认为您是 运行 具有 JNI 调用的 Java 应用程序,该技巧不适用于您。您必须在应用程序启动时从 JAVA 设置这些环境变量。

尝试查看 OS.setenv() - https://developer.android.com/reference/android/system/Os.html。我希望这些环境变量可以在加载 JNI 库之前从 Java 设置,或者库在每次调用时读取这些环境变量,而不仅仅是 init。

如果已接受的答案对您不起作用,那么我的解决方案可能会奏效:

#!/system/bin/sh
LIBC_DEBUG_MALLOC_OPTIONS=free-track logwrapper
exec "$@"

确保行尾是 LF 而不是 CRLF。

然后我的问题是 malloc 调试无法写入转储:

E/malloc_debug: Unable to create file: /data/local/tmp/backtrace_heap.16934.exit.txt

我认为这可能是因为缺少权限。通过将输出文件夹更改为您的应用程序之一,可以避免这种情况:

LIBC_DEBUG_MALLOC_OPTIONS='backtrace backtrace_dump_on_exit backtrace_dump_prefix=data/data/com.your.app/files/dump' logwrapper

转储现在有效:

E/malloc_debug: Dumping to file: data/data/com.your.app/files/dump.17599.exit.txt

还要确保设置

buildTypes{
debug {
            debuggable true
        }
}

在build.gradle和

android:extractNativeLibs="true"
android:debuggable="true"

在 AndroidManifest.xml 文件中