0

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

我的wrap.sh每个脚本都包含以下内容:

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

我已经设置了以下目录结构:

目录结构

当我 grep logcat 为“启用 malloc 调试”时,我什么也得不到。

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

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

这正是wrap shell 脚本的文档说要添加的内容(尽管对我来说这似乎是无效的 shell 脚本语法),我可以看到“启用 malloc 调试”日志消息,但我的应用程序在启动屏幕上冻结,实际上从未发射。

我不确定发生了什么,并且会喜欢任何类型的输入。

其他注意事项:

  • 我的项目正在使用 CMake。
  • 我的调试设备运行的是 Android P。
4

2 回答 2

0

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

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

于 2019-07-30T07:22:02.040 回答
0

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

#!/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 文件中

于 2021-08-25T11:58:19.560 回答