diff --git a/scripts/pid b/scripts/pid new file mode 100755 index 000000000..a9f55d3e8 --- /dev/null +++ b/scripts/pid @@ -0,0 +1,42 @@ +#!/bin/bash +# Copyright (C) 2018 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Get the pid of processes matching a string. +EXACT=0 +if [ "$1" = "--exact" ]; then + EXACT=1 + shift +fi + +EXE="$1" +if ! [ "$EXE" ] ; then + echo "usage: pid [--exact] " + exit 255 +fi + +if [ $EXACT == 1 ]; then + PIDS="$(adb shell pidof $EXE)" + RC=$? +else + PIDS=$(adb shell "ps -o PID,NAME | tail -n +1 | grep $EXE | tr -s ' ' | cut -f2 -d' '") + [ -n "$PIDS" ] + RC=$? +fi + +for PID in $PIDS; do + echo $PID +done + +exit $RC diff --git a/scripts/stacks b/scripts/stacks new file mode 100755 index 000000000..f66b7b39f --- /dev/null +++ b/scripts/stacks @@ -0,0 +1,44 @@ +#!/bin/bash +# Copyright (C) 2018 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Get backtraces for a process. +if [[ $1 =~ ^[0-9]+$ ]] ; then + PID="$1" +elif [ "$1" ] ; then + # Try --exact first, and fallback to nonexact if we find nothing. + PIDLIST="$(pid --exact $1 || pid $1)" + if [[ $PIDLIST =~ ^[0-9]+$ ]] ; then + PID="$PIDLIST" + elif [ "$PIDLIST" ] ; then + echo "more than one process: $1" + else + echo "no such process: $1" + fi +else + echo "usage: stacks [pid|process name]" +fi + +if [ "$PID" ] ; then + # Use `debuggerd -j` on java processes. + if adb shell readlink /proc/$PID/exe | egrep -q '^/system/bin/app_process' ; then + # But not the zygote. + if ! adb shell cat /proc/$PID/cmdline | egrep -q '^zygote'; then + adb shell debuggerd -j $PID + exit $? + fi + fi + + adb shell debuggerd -b $PID +fi