android - 使用包装器脚本时无法调试应用程序

标签 android android-ndk address-sanitizer

我已经为我的应用程序的 native 代码激活了地址清理器,以检测内存泄漏。但是我有一个奇怪的问题。

在激活地址清理器之前,应用程序正常运行,我可以毫无问题地对其进行调试。但是在激活地址清理器之后,我无法再调试应用程序,即使它运行得很好。这是一个非常奇怪的行为,因为在激活地址 sanitizer 之后,"Waiting for Debugger..."消息不再显示,我在调试控制台中收到以下错误:

Could not connect to remote process. Aborting debug session.

与此同时,应用程序运行良好,如果我运行 adb shell ps -A 就可以轻松找到它虽然我不会在 "attach to process" 中看到它菜单。

知道问题出在哪里吗?

最佳答案

最后在我的 bug 中的人们的帮助下 thread ,我能够为 android 27+ 创建一个工作 包装器脚本。 我几乎可以肯定您现在在 Internet 上找不到任何其他可用的包装器脚本,这是唯一可用的脚本

这是完整的脚本:

#!/system/bin/sh
processname=$1
shift
sdkversion=$(getprop ro.build.version.sdk)
if [ "$sdkversion" -gt "28" ]; then
fullpath="$processname -XjdwpProvider:adbconnection $@"
elif [ "$sdkversion" -eq "28" ]; then
fullpath="$processname -XjdwpProvider:adbconnection -XjdwpOptions:suspend=n,server=y -Xcompiler-option --debuggable $@"
elif [ "$sdkversion" -eq "27" ]; then
fullpath="$processname -Xrunjdwp:transport=dt_android_adb,suspend=n,server=y -Xcompiler-option --debuggable -Xcompiler-option --generate-mini-debug-info $@"
else
log -p e -t "WRAPPER" "Wrapper script only works starting API level 27!"
exit 1
fi
$fullpath

要与 ASAN 一起使用,只需在包装器脚本的开头添加所需的 ASAN 配置(例如 LD_PRELOAD)。所以它会变成这样:

#!/system/bin/sh
HERE="$(cd "$(dirname "$0")" && pwd)"
export ASAN_OPTIONS=log_to_syslog=false,allow_user_segv_handler=1
export LD_PRELOAD=$HERE/libclang_rt.asan-${arch}-android.so
processname=$1
shift
sdkversion=$(getprop ro.build.version.sdk)
if [ "$sdkversion" -gt "28" ]; then
fullpath="$processname -XjdwpProvider:adbconnection $@"
elif [ "$sdkversion" -eq "28" ]; then
fullpath="$processname -XjdwpProvider:adbconnection -XjdwpOptions:suspend=n,server=y -Xcompiler-option --debuggable $@"
elif [ "$sdkversion" -eq "27" ]; then
fullpath="$processname -Xrunjdwp:transport=dt_android_adb,suspend=n,server=y -Xcompiler-option --debuggable -Xcompiler-option --generate-mini-debug-info $@"
else
log -p e -t "WRAPPER" "Wrapper script only works starting API level 27!"
exit 1
fi
$fullpath

希望这个脚本对大家有用。

更新:谷歌更新了wrap.sh基于此线程的 NDK 中的页面。您也可以在那里看到最终包装器脚本。

最好的问候

关于android - 使用包装器脚本时无法调试应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54550668/

相关文章:

c++ - ASAN 检测到与动态加载的库共享的类的 vtable 的 ODR 违规

android - 更改 imageView 的枢轴

android - 在 Android 中使用 DownloadManager 从标题中获取文件名

android - fatal error : android_native_app_glue. h:没有这样的文件或目录

ios - AddressSanitizer 报告断点命中 : dynamic-stack-buffer-overflow

address-sanitizer - 可以使用环境变量禁用asan吗?

java - 推送通知时出现致命异常

php - 如何使用 Android 中的 HTTP 将 Android 中 SQLite 数据库中存储的数据发送到 PHP Web 服务器

Android NDK 找不到 STLport

android - Android Studio Canary 3.0 中的 NDK 问题