无法打开 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" 日志消息,但我的应用程序冻结了在初始屏幕上,从未真正启动。
我不确定发生了什么,希望任何类型的输入。
其他说明:
- 我的项目正在使用 CMake。
- 我的调试设备是运行AndroidP.
那是 运行 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 文件中
我正在尝试为我的 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" 日志消息,但我的应用程序冻结了在初始屏幕上,从未真正启动。
我不确定发生了什么,希望任何类型的输入。
其他说明:
- 我的项目正在使用 CMake。
- 我的调试设备是运行AndroidP.
那是 运行 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 文件中