のねのBlog

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

linuxでのgdbclientの使い方

android gdb debug - のねの日記
コマンドラインのgdbclientの方法を応用し、eclipseでデバッグ - のねの日記
linuxでのgdbclientの使い方 - のねの日記

ソースをmakeした環境での話です。
gdbのコマンドを打ちたいとき。

PATHや環境変数の準備
. build/envsetup
lunch maguro-full
2つ端末画面を開く。
1番目の端末画面
adb forward tcp:5039 tcp:5039
adb shell
$su
#gdbserver :5039 --attach 790
(gdbserver :5039 /system/bin/app_process)でもいい。
Attached; pid = 790
Listening on port 5039
Remote debugging from host 127.0.0.1
gdbserverを起動する。 790はattachしたいPIDです。 (app_processのPID)
2番目の端末画面
gdbclient app_process :5039 790
(gdbclient app_process :5039)でもいい。
これでgdbのコマンドが打てる。
Cannot attach to lwp 790: Operation not permitted (1) このようなエラーが出る理由は、adb shellにルート権限がないためです。 $adb root でroot権限が持てます。
dddを使う場合、以下のようにenvsetup.shへ追加します。
ddd --debugger arm-eabi-gdb -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE"
dddclient app_process :5039 308
gdbclient () 
{ 
    local OUT_ROOT=$(get_abs_build_var PRODUCT_OUT);
    local OUT_SYMBOLS=$(get_abs_build_var TARGET_OUT_UNSTRIPPED);
    local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED);
    local OUT_EXE_SYMBOLS=$(get_abs_build_var TARGET_OUT_EXECUTABLES_UNSTRIPPED);
    local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS);
    local ARCH=$(get_build_var TARGET_ARCH);
    local GDB;
    case "$ARCH" in 
        x86)
            GDB=i686-linux-android-gdb
        ;;
        arm)
            GDB=arm-linux-androideabi-gdb
        ;;
        mips)
            GDB=mipsel-linux-android-gdb
        ;;
        *)
            echo "Unknown arch $ARCH";
            return 1
        ;;
    esac;
    if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then
        local EXE="$1";
        if [ "$EXE" ]; then
            EXE=$1;
        else
            EXE="app_process";
        fi;
        local PORT="$2";
        if [ "$PORT" ]; then
            PORT=$2;
        else
            PORT=":5039";
        fi;
        local PID;
        local PROG="$3";
        if [ "$PROG" ]; then
            if [[ "$PROG" =~ ^[0-9]+$ ]]; then
                PID="$3";
            else
                PID=`pid $3`;
            fi;
            adb forward "tcp$PORT" "tcp$PORT";
            adb shell gdbserver $PORT --attach $PID & sleep 2;
        else
            echo "";
            echo "If you haven't done so already, do this first on the device:";
            echo "    gdbserver $PORT /system/bin/$EXE";
            echo " or";
            echo "    gdbserver $PORT --attach $PID";
            echo "";
        fi;
        echo "set solib-absolute-prefix $OUT_SYMBOLS" >|"$OUT_ROOT/gdbclient.cmds";
        echo "set solib-search-path $OUT_SO_SYMBOLS:$OUT_SO_SYMBOLS/hw:$OUT_SO_SYMBOLS/ssl/engines:$OUT_SO_SYMBOLS/drm:$OUT_SO_SYMBOLS/egl:$OUT_SO_SYMBOLS/soundfx" >> "$OUT_ROOT/gdbclient.cmds";
        echo "target remote $PORT" >> "$OUT_ROOT/gdbclient.cmds";
        echo "" >> "$OUT_ROOT/gdbclient.cmds";
        $ANDROID_TOOLCHAIN/$GDB -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE";
    else
        echo "Unable to determine build system output dir.";
    fi
}