Не удается отладить приложение при использовании сценария оболочки - PullRequest
0 голосов
/ 06 февраля 2019

Я активировал очиститель адресов для собственных кодов моего приложения, чтобы обнаружить утечку памяти.Но у меня странная проблема.

Прежде чем активировать очиститель адресов, приложение просто работает нормально, и я могу отладить его без проблем.Но после активации очистителя адресов я больше не могу отлаживать приложение, даже если оно работает нормально.Это действительно странное поведение, потому что после активации средства очистки адреса, сообщение "Waiting for Debugger..." больше не отображается, и я получаю следующую ошибку в консоли отладки:

Could not connect to remote process. Aborting debug session.

В то же время, приложение работает нормально, и я могу найтиэто легко, если я запускаю adb shell ps -A, а я не вижу его в меню "attach to process".

Есть идеи, в чем проблема?

1 Ответ

0 голосов
/ 20 февраля 2019

Наконец, с помощью людей из моей темы , я смог создать рабочий скрипт-обертку для android 27 + . Я почти уверен, что сейчас вы не можете найти какой-либо другой работающий скрипт-обертку в Интернете, и это единственный работающий .

Вот полный скрипт:

#!/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 обновлено wrap.sh страница в NDK на основе этой темы.Там же вы можете увидеть финальный скрипт-обертку.

С наилучшими пожеланиями

...