我已为我的应用的本机代码激活了地址清除程序,以检测某些内存泄漏。但是我有一个奇怪的问题。
在激活地址清理器之前,应用程序可以正常运行,并且我可以对其进行调试而没有任何问题。但是在激活地址清理器之后,即使它运行良好,我也无法调试应用程序。这是一个非常奇怪的行为,因为激活地址清理器后,"Waiting for Debugger..."
消息不再显示,并且在调试控制台中出现以下错误:
Could not connect to remote process. Aborting debug session.
同时,该应用程序运行良好,如果运行adb shell ps -A
,我会很容易找到它,而在"attach to process"
菜单中看不到它。
有什么问题吗?
答案 0 :(得分:1)
最后,在臭虫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
我希望这个脚本对每个人都有用。
更新:Google根据此线程在NDK中更新了wrap.sh页。您也可以在那里看到最终的包装器脚本。
最好的问候