2010年10月14日

gdb - リモートデバッグ

gdbを使ってリモートデバッグを行う手順例を示す。


 

ロスプラットフォームでの開発や、CUIアプリの実際の実行画面を確認しながらのデバッグを行いたい場合にリモートデバッグを使う。

 

環境

 
+-------+    +---------+
|デバッグ|--->|デバッグ  |
|ホスト  |    |ターゲット|
+-------+    +---------+

実行例

デバッグターゲットとデバッグホストが同じだが、2つの端末を用いた例を解説。例は、端末1と端末2の2つの端末が同一マシンの同一ユーザにログインしている状態とする。

     
  • 端末1(デバッグターゲット)でテストプログラムを作成    
    guest@debian5:~$ cat tst.c
    #include <stdio.h>

    int main()
    {
            printf("h"); fflush(stdout);
            printf("e"); fflush(stdout);
            printf("l"); fflush(stdout);
            printf("l"); fflush(stdout);
            printf("o"); fflush(stdout);
            printf(" "); fflush(stdout);
            printf("w"); fflush(stdout);
            printf("o"); fflush(stdout);
            printf("r"); fflush(stdout);
            printf("l"); fflush(stdout);
            printf("d"); fflush(stdout);
            printf("\n"); fflush(stdout);

            return 0;
    }

    guest@debian5:~$ gcc -g tst.c -o tst
    guest@debian5:~$


     

     
  • 端末1(デバッグターゲット)でgdbserverを起動    
    guest@debian5:~$ gdbserver localhost:1234 tst
    Process tst created; pid = 3181
    Listening on port 1234
     
     
  • 端末2(デバッグホスト)でgdbを起動    
    guest@debian5:~$ gdb ./tst
    GNU gdb 6.8-debian
    Copyright (C) 2008 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "i486-linux-gnu"...
    (gdb) break main
    Breakpoint 1 at 0x8048415: file tst.c, line 5.
    (gdb) target remote localhost:1234
    Remote debugging using localhost:1234
    [New Thread 3181]
    0xb7f07810 in ?? () from /lib/ld-linux.so.2
    (gdb) c
    Continuing.

    Breakpoint 1, main () at tst.c:5
    5               printf("h"); fflush(stdout);
    (gdb) s
    6               printf("e"); fflush(stdout);
    (gdb)
    7               printf("l"); fflush(stdout);
    (gdb)
    8               printf("l"); fflush(stdout);
    (gdb)
    9               printf("o"); fflush(stdout);
    (gdb)
    10              printf(" "); fflush(stdout);
    (gdb)
    11              printf("w"); fflush(stdout);
    (gdb)
    12              printf("o"); fflush(stdout);
    (gdb)
    13              printf("r"); fflush(stdout);
    (gdb)
    14              printf("l"); fflush(stdout);
    (gdb)
    15              printf("d"); fflush(stdout);
    (gdb)
    16              printf("\n"); fflush(stdout);
    (gdb)
    18              return 0;
    (gdb)
    19      }
    (gdb)
    0xb7dbb455 in __libc_start_main () from /lib/i686/cmov/libc.so.6
    (gdb) c
    Continuing.

    Program exited normally.
    (gdb)


     

     
  • 端末1(デバッグターゲット)の表示に以下が追加される(特に"hello world"が端末2のステップ実行に合わせて1文字づつ表示されている状況が必見)    
    Remote debugging from host 127.0.0.1
    hello world

    Child exited with retcode = 0

    Child exited with status 0
    GDBserver exiting
    guest@debian5:~$


     

     
  • 因みに、リモートデバッグをやらずにローカルで直接デバッグすると以下の様になる。 ※"hello world"がデバッガの出力と混ざってしまっている。    
    guest@debian5:~$ gdb ./tst
    GNU gdb 6.8-debian
    Copyright (C) 2008 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
    This is free software: you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
    and "show warranty" for details.
    This GDB was configured as "i486-linux-gnu"...
    (gdb) break main
    Breakpoint 1 at 0x8048415: file tst.c, line 5.
    (gdb) r
    Starting program: /home/guest/tst

    Breakpoint 1, main () at tst.c:5
    5               printf("h"); fflush(stdout);
    (gdb) s
    h6              printf("e"); fflush(stdout);
    (gdb)
    e7              printf("l"); fflush(stdout);
    (gdb)
    l8              printf("l"); fflush(stdout);
    (gdb)
    l9              printf("o"); fflush(stdout);
    (gdb)
    o10             printf(" "); fflush(stdout);
    (gdb)
    11             printf("w"); fflush(stdout);
    (gdb)
    w12             printf("o"); fflush(stdout);
    (gdb)
    o13             printf("r"); fflush(stdout);
    (gdb)
    r14             printf("l"); fflush(stdout);
    (gdb)
    l15             printf("d"); fflush(stdout);
    (gdb)
    d16             printf("\n"); fflush(stdout);
    (gdb)

    18              return 0;
    (gdb)
    19      }
    (gdb)
    0xb7e6f455 in __libc_start_main () from /lib/i686/cmov/libc.so.6
    (gdb) c
    Continuing.

    Program exited normally.
    (gdb)


     

備考

     
  • RHELをターゲットにリモートデバッグを行うとSIGTRAPが大量に発生する。正しい対処法かどうかはわからないが、以下で抑制可能。    
    (gdb) handle SIGTRAP nostop noprint nopass
    SIGTRAP is used by the debugger.
    Are you sure you want to change it? (y or n) y

    Signal        Stop      Print   Pass to program Description
    SIGTRAP       No        No      No              Trace/breakpoint trap
    (gdb)


     

参考資料

     
  • "info gdb"の"Remote Debugging"

0 件のコメント:

コメントを投稿

ラベル

Android Android-x86 apache Backup Blog CentOS DDNS Debian DIY DTM Eclipse Excel Fedora Firefox Google Chrome Hyper-V java Kreetingkard KVM Linux Linux Mint Linuxコマンド例 Linuxシステム管理 Linux管理 Minecraft Minecraft: Wii U Edition Nintendo 3DS nmap O'REILLY Office KB openssl OpenStack openSUSE openSUSE 12 Parted Magic patch(1) PC DIY PC自作 pgrep(1) PHP Picasa pmap(1) PMMP Postfix postgresql printer ps(1) pukiwiki QEMU RHEL rhel5 rhel6 samba sar(1) savscan(1) savupdate(1) Scientific Linux 6 security SELinux SEO showrgb(1) Slackware Linux SLES smbclient(1) smbstatus(1) snmpd(8) squid startx(1) stat(1) strace(1) syslogd(8) tac(1) tee(1) testdisk Thunderbird timezone tomcat touch(1) tr(1) trouble shooting tuning ubuntu uname(1) USB tethering USBブート USBメモリ vi(1) vim(1) virtualbox VMWare VMWare Player vmware server VMware Tools VNC Web Services Wii U Windows wordpress x window XAMPP イベント・祭り インターネット おもちゃ屋 カツカレー ギフト クリーニング店 ゲーム ゴミ コンビニ サンプルコード スポーツ スポット スマホ ソースコード その他 ダーツ ツールTIPS つぶやき ディスク設定 デジタルDIY デジタルガジェット デスクトップ設定 ドラッグストア トラブル トラブルシューティング ニュース ネットワーク設定 バス観光 バックアップ・リストア ビリヤード ブログパーツ プログラミング ブログ作成 ペット用品店 ホームセンター マンションギャラリー メダリーフ リモートアクセス設定 リラクゼーション レジストリ 為替 映画館 英語勉強メモ 横浜市 横浜市交通局 横浜矢向周辺 横濱たちばな亭 屋台 屋内プレイランド 屋内遊園地 温泉 花火 画像 海水浴場 外食 街猫 学校 楽天ウェブサービス 鎌倉 交通 公園 公共施設 国内x86サーバ 災害 雑貨店 参考文献 散髪 使い方 子供教室 死因 寺社 車関連 習い事 住居メンテナンス 出前 情報 食料品店 尻手駅前 新横浜 新横浜駅 新規出店情報 新築 新鶴見公園 新鶴見人道橋 神社 水族館 川崎 川崎駅 川崎市南部市場 川崎大師 卓球 段葛 中古屋 中山ビル 釣り施設 鶴岡八幡宮 鶴見 鶴見神社 電気店 電車 統計 動物園 南武線 日枝神社 買い物 買物 博物館等 八景島シーパラダイス 美容・サロン 百貨店 病院 風呂 複合商業施設 保育園 本屋 漫画 漫画喫茶 矢向 遊園地