使用包装器脚本时无法调试应用程序
Cannot debug app when using wrapper script
我已经为我的应用程序的本机代码激活了地址清理器,以检测内存泄漏。但是我有一个奇怪的问题。
在激活地址清理程序之前,应用程序仅 运行s 正常,我可以毫无问题地调试它。但是在激活地址清理器之后,我无法再调试应用程序,即使它 运行 很好。这是一个非常奇怪的行为,因为在激活地址清理器后,"Waiting for Debugger..."
消息不再显示,我在调试控制台中收到以下错误:
Could not connect to remote process. Aborting debug session.
同时,应用程序运行良好,如果我 运行 adb shell ps -A
我可以很容易地找到它,而我不会在 "attach to process"
菜单中看到它。
知道问题出在哪里吗?
终于在我的错误 thread 中的人们的帮助下,我能够为 android 27 创建一个 working 包装脚本+。 我几乎可以肯定您现在在 Internet 上找不到任何其他可用的包装脚本,这是唯一可用的脚本。
这是完整的脚本:
#!/system/bin/sh
processname=
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 "[=11=]")" && pwd)"
export ASAN_OPTIONS=log_to_syslog=false,allow_user_segv_handler=1
export LD_PRELOAD=$HERE/libclang_rt.asan-${arch}-android.so
processname=
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 页面。您也可以在那里看到最终包装脚本。
此致
我已经为我的应用程序的本机代码激活了地址清理器,以检测内存泄漏。但是我有一个奇怪的问题。
在激活地址清理程序之前,应用程序仅 运行s 正常,我可以毫无问题地调试它。但是在激活地址清理器之后,我无法再调试应用程序,即使它 运行 很好。这是一个非常奇怪的行为,因为在激活地址清理器后,"Waiting for Debugger..."
消息不再显示,我在调试控制台中收到以下错误:
Could not connect to remote process. Aborting debug session.
同时,应用程序运行良好,如果我 运行 adb shell ps -A
我可以很容易地找到它,而我不会在 "attach to process"
菜单中看到它。
知道问题出在哪里吗?
终于在我的错误 thread 中的人们的帮助下,我能够为 android 27 创建一个 working 包装脚本+。 我几乎可以肯定您现在在 Internet 上找不到任何其他可用的包装脚本,这是唯一可用的脚本。
这是完整的脚本:
#!/system/bin/sh
processname=
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 "[=11=]")" && pwd)"
export ASAN_OPTIONS=log_to_syslog=false,allow_user_segv_handler=1
export LD_PRELOAD=$HERE/libclang_rt.asan-${arch}-android.so
processname=
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 页面。您也可以在那里看到最终包装脚本。
此致