のねのBlog

パソコンの問題や、ソフトウェアの開発で起きた問題など書いていきます。よろしくお願いします^^。

(FirefoxOS)b2g run-gdb.sh

B2G/run-gdb.sh B2G GitHub

#!/bin/bash

SCRIPT_NAME=$(basename $0)

basename  ファイル名からディレクトリや末尾の文字列を削除したものを返す

. load-config.sh
#!/bin/bash

if [[ ! -n "$B2G_DIR" ]]; then
  B2G_DIR=$(cd `dirname $0`; pwd)
fi

. "$B2G_DIR/.config"
if [ $? -ne 0 ]; then
	echo Could not load .config. Did you run config.sh?
	exit -1
fi

if [ -f "$B2G_DIR/.userconfig" ]; then
	. "$B2G_DIR/.userconfig"
fi
ADB=adb
GDB=${GDB:-prebuilt/$(uname -s | tr "[[:upper:]]" "[[:lower:]]")-x86/toolchain/arm-linux-androideabi-4.4.x/bin/arm-linux-androideabi-gdb}

tr [ オプション ] [ 文字セット1 [ 文字セット2 ] ]

$ uname -s
Linux
$ uname -s | tr ":upper:" ":lower:"
linux

B2G_BIN=/system/b2g/b2g
GDBINIT=/tmp/b2g.gdbinit.$(whoami)

$ GDBINIT=/tmp/b2g.gdbinit.$(whoami)
$ echo $GDBINIT
/tmp/b2g.gdbinit.user01
$ GDBINIT=/tmp/b2g.gdbinit.whoami
$ echo $GDBINIT
/tmp/b2g.gdbinit.whoami

GONK_OBJDIR=out/target/product/$DEVICE
SYMDIR=$GONK_OBJDIR/symbols

GDBSERVER_PID=$($ADB shell 'toolbox ps gdbserver | (read header; read user pid rest; echo -n $pid)')

root@android:/ # toolbox ps
USER PID PPID VSIZE RSS WCHAN PC NAME
root 306 49 716 420 c002a7a0 4000ce74 S /system/bin/sh
root 360 306 900 356 00000000 40010458 R toolbox <=プロセス名が違う

root@android:/ # ps
USER PID PPID VSIZE RSS WCHAN PC NAME
root 306 49 716 420 c002a7a0 4000ce74 S /system/bin/sh
root 362 306 900 356 00000000 40010458 R ps

形式

read [-p][-r][-u[num]][varname ...]
機能

標準入力から読み込みを行います。標準入力から1行読み取り,読み込んだ内容をvarnameに指定したシェル変数に格納します。

GDB_PORT=$((10000 + $(id -u) % 50000))
if [ "$1" = "attach"  -a  -n "$2" ] ; then
   B2G_PID=$2
   if [ -z "$($ADB ls /proc/$B2G_PID)" ] ; then
      echo Error: PID $B2G_PID is invalid
      exit 1;
   fi
   GDB_PORT=$((10000 + ($B2G_PID + $(id -u)) % 50000))
   # cmdline is null separated
   B2G_BIN=$($ADB shell cat /proc/$B2G_PID/cmdline | tr '\0' '\n' | head -1)
else
   B2G_PID=$($ADB shell 'toolbox ps b2g | (read header; read user pid rest; echo -n $pid)')
fi
for p in $GDBSERVER_PID ; do
   $ADB shell cat /proc/$p/cmdline | grep -q :$GDB_PORT && ( \
      echo ..killing gdbserver pid $p
      $ADB shell kill $p
   ) || echo ..ignoring gdbserver pid $p

done
$ADB forward tcp:$GDB_PORT tcp:$GDB_PORT

if [ "$1" = "attach" ]; then
   if [ -z "$B2G_PID" ]; then
      echo Error: No PID to attach to. B2G not running?
      exit 1
   fi

   $ADB shell gdbserver :$GDB_PORT --attach $B2G_PID &
else
   if [ -n "$1" ]; then
      B2G_BIN=$1
      shift
   fi
   [ -n "$MOZ_PROFILER_STARTUP" ] && GDBSERVER_ENV="$GDBSERVER_ENV MOZ_PROFILER_STARTUP=$MOZ_PROFILER_STARTUP "
   [ -n "$MOZ_DEBUG_CHILD_PROCESS" ] && GDBSERVER_ENV="$GDBSERVER_ENV MOZ_DEBUG_CHILD_PROCESS=$MOZ_DEBUG_CHILD_PROCESS "
   [ -n "$MOZ_DEBUG_APP_PROCESS" ] && GDBSERVER_ENV="$GDBSERVER_ENV MOZ_DEBUG_APP_PROCESS='$MOZ_DEBUG_APP_PROCESS' "
   [ -n "$MOZ_IPC_MESSAGE_LOG" ]     && GDBSERVER_ENV="$GDBSERVER_ENV MOZ_IPC_MESSAGE_LOG=$MOZ_IPC_MESSAGE_LOG "

   [ -n "$B2G_PID" ] && $ADB shell kill $B2G_PID
   [ "$B2G_BIN" = "/system/b2g/b2g" ] && $ADB shell stop b2g

   if [ "$($ADB shell "if [ -f /system/b2g/libdmd.so ]; then echo 1; fi")" != "" ]; then
     echo ""
     echo "Using DMD."
     echo ""
     dmd="1"
     ld_preload_extra="/system/b2g/libdmd.so"
  fi

   $ADB shell DMD=$dmd LD_LIBRARY_PATH=/system/b2g LD_PRELOAD=\"$ld_preload_extra /system/b2g/libmozglue.so\" TMPDIR=/data/local/tmp $GDBSERVER_ENV gdbserver --multi :$GDB_PORT $B2G_BIN $@ &
fi
sleep 1
echo "set solib-absolute-prefix $SYMDIR" > $GDBINIT
echo "handle SIGPIPE nostop" >> $GDBINIT
echo "set solib-search-path $GECKO_OBJDIR/dist/bin:$SYMDIR/system/lib:$SYMDIR/system/lib/hw:$SYMDIR/system/lib/egl:$SYMDIR/system/bin:$GONK_OBJDIR/system/lib:$GONK_OBJDIR/system/lib/egl:$GONK_OBJDIR/system/lib/hw:$GONK_OBJDIR/system/vendor/lib:$GONK_OBJDIR/system/vendor/lib/hw:$GONK_OBJDIR/system/vendor/lib/egl" >> $GDBINIT
echo "target extended-remote :$GDB_PORT" >> $GDBINIT

PROG=$GECKO_OBJDIR/dist/bin/$(basename $B2G_BIN)
[ -f $PROG ] || PROG=${SYMDIR}${B2G_BIN}

if [ "$SCRIPT_NAME" == "run-ddd.sh" ]; then
    echo "ddd --debugger \"$GDB -x $GDBINIT\" $PROG"
    ddd --debugger "$GDB -x $GDBINIT" $PROG
else
    echo $GDB -x $GDBINIT $PROG
    $GDB -x $GDBINIT $PROG
fi