gdb attach使用

11004 ワード

デバッグ:
psコマンドはプロセスidを表示します.gdb attach pidを実行すると、実行中のプログラムをデバッグできます.info proc現在のプログラム実行可能ファイル関連情報(name,pwd)を表示
ブレークポイント関連:
b pkt.c:22(pkt.cファイルの22行のブレークポイント)b eth_rcv(関数eth_rcv入口でブレークポイント)info b;現在のすべてのブレークポイントを表示する;d num;ブレークポイントnumを削除する;n num;numを後ろに実行するnumステップ
btは現在の関数の呼び出しプロセスを表示する.
変数値の印刷:
p temp;デフォルトの10進数印刷p/x temp;16進数でxを印刷し、16進数で変数を表示します.d変数を十進法で表示します.u符号なし整数を16進数で表示する.o変数を8進数で表示します.t変数をバイナリ形式で表示します.a変数を16進数で表示します.c変数を文字形式で表示します.f変数を浮動小数点数形式で表示します.変数タイプの表示:whatis var;表示var変数のタイプ表示変数の構造体メンバー:ptype var;varタイプ構造体のメンバーの表示
gdbの変数:
プログラムの変数とgdbの変数はインタラクティブであり、gdbの変数はiのように先頭にある.
set $i=0
print a[$i++]

aアドレスから始まるメモリの値を印刷することができます.
条件はブレークポイントに入ります.
例:b arp_rcv if index=1234(index=1234の場合はブレークポイントに入り、単等号であることに注意)
メモリの表示:
x/xを16進数でx/dを出力x/cを10進数で出力x/cを1文字で出力x/i逆アセンブリ–通常、x/10 i ip−20を使用して現在のアセンブリ(ipは命令レジスタ)x/sを文字列で出力します.
指定したメモリの先頭100バイトの内容を印刷します:x/100 ua pkt->data
一時変数の設定:
set i=msg−>msgdataprint i印刷変数msg->msg_dataポインタ;ptype$i印刷msg->msg_dataタイプ
commandコマンド:
デバッグを自動化し、gdbのコマンドのセットをパッケージ化します.ブレークポイントまで実行すると、一連のコマンドが自動的に実行されます.次のようになります.
(gdb) b ftm_pkt_rcv_from_app
Breakpoint 1 at 0x191a8: file ftm_pkt.c, line 204.
(gdb) command 1
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>p /x pmesg
>p /x pmesg->msg_data
>
>end
(gdb) c
Continuing.

Breakpoint 1, ftm_pkt_rcv_from_app (pmesg=pmesg@entry=0x45b2c) at ftm_pkt.c:204
204     ftm_pkt.c: No such file or directory.
$1 = 0x45b2c
$2 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x59, 0x6d, 0x38, 0x9c, 0x74, 0xa, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x12, 0x0, 0x0, 0x0,
  0x0, 0x0, 0x10, 0x0, 0x12, 0x0, 0x0, 0x47, 0x1, 0x3d, 0x0, 0xa, 0x1, 0x0, 0x8, 0x4, 0x0, 0x1, 0x0, 0x0, 0x0, 0x64, 0x1e, 0x81, 0x1, 0x2, 0x3, 0x4c,
  0xcc, 0x6a, 0x70, 0xf4, 0x17, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x45, 0x0 71 times>, 0x68, 0x61, 0xa, 0x0, 0x76,
  0x61, 0xa, 0x0 101 times>, 0x4c, 0xcc, 0x6a, 0x70, 0xf4, 0x17, 0x64, 0x1e, 0x81, 0x1, 0x2, 0x3, 0x8, 0x0, 0x45, 0x0, 0x0, 0x3d, 0x21, 0xd3,
  0x40, 0x0, 0x40, 0x6, 0x8, 0x76, 0xc0, 0xa8, 0xc7, 0x65, 0xc0, 0xa8, 0xc7, 0xbb, 0xa, 0x5a, 0x22, 0x43, 0x29, 0x29, 0xcd, 0x77, 0x80, 0x2b, 0x6b,
  0x57, 0x50, 0x18, 0x39, 0x8, 0xb5, 0x75, 0x0, 0x0, 0x47, 0x4e, 0x55, 0x20, 0x67, 0x64, 0x62, 0x20, 0x28, 0x47, 0x44, 0x42, 0x29, 0x20, 0x37, 0x2e,
  0x34, 0x2e, 0x31, 0xd, 0xa, 0x78, 0x0 202 times>, 0x63, 0x82, 0x53, 0x63, 0x35, 0x1, 0x1, 0x3d, 0x7, 0x1, 0xd4, 0xee, 0x7, 0x27...}
(gdb)

呼び出し関数:
(gdb)call func()例えば:(gdb)call printf(「hello world!」);
リダイレクト標準出力stdoutとstderr:
1)stdout、stderrに対応するファイル記述子を閉じます.(gdb)call(int)close(1)(gdb)call(int)close(2)2)次に、次のコマンドを使用して、現在のgdbウィンドウが存在する仮想端末を表示します.(gdb)shell tty/dev/pts/03)このときstdoutとstderrを再開し、gdbウィンドウがある仮想端末に関連付けます.(gdb)p(int)open("/dev/pts/0",2)1=1(gdb)p(int)open("/dev/pts/0",2)2=2この2つのコマンドの実行結果が上記の結果(1と2)でない場合、openの実行に失敗したことを意味し、closeとopen.4を再実行する必要がある)次に、call printf("hello world");gdbデバッグウィンドウで印刷情報を直接表示できます.5)stdoutおよびstderr呼び出しfflush強制リフレッシュバッファ:(gdb)call(int)fflush(0)
また、ここの「/dev/pts/0」をターゲットファイル名に置き換えると、stderrとstdoutをファイルにリダイレクトできます.
shellモードのコマンドを使用します.
(gdb) define tar End with a line saying just “end”.
shell tar end
(gdb)tarはshellモードでtarコマンドを使用でき、クラス比は他のコマンドを得ることができます.
以下は検証されていません.
watch div 1=div 2変数div 1 yu div 2が等しい場合に割り込みに入ります.info threadは、現在のプロセスのスレッドを表示します.threadデバッグを切り替えるスレッドは、指定したIDのスレッドです.break file.c:100 thread allはfile.cファイルの100行目では、ここを通るすべてのスレッドにブレークポイントを設定します.set scheduler-locking off|on|step、これは最も多くの質問です.stepまたはcontinueコマンドを使用して現在デバッグされているスレッドをデバッグする場合、他のスレッドも同時に実行されますが、どのようにしてデバッグされたプログラムだけを実行させますか?このコマンドでこのニーズを実現できます.offはスレッドをロックしません.つまり、すべてのスレッドが実行されます.これがデフォルトです.on現在のデバッガのみが実行されます.Stepは単一ステップでnextが関数を通過した場合(状況に詳しい人は知っているかもしれませんが、これは実はブレークポイントを設定してcontinueの動作であることを知っています)以外は、現在のスレッドだけが実行されます.