#topicpath ///////////////////////////////////////////////////////////////////////////////// * 目次 [#eff751c0] #contents(); ///////////////////////////////////////////////////////////////////////////////// * 起動オプション [#a04ac3e7] |~section |~option |~description |~remark | |Select Files |<file>&br;--exec=<file> |実行形式ファイルとして <file> を指定 | | |~|-c <file>&br;--core=<file> |core ファイルとして <file> を指定 | | |~|--se=<file> |シンボルファイル及び実行形式ファイルとして <file> を指定 | | |~|--symbols=<file> |シンボルフィルとして <file> を指定 | | |Output and user interface control |--tui |''T''erminal が ''U''ser ''I''nterface であるものとして扱う。 |ターミナルの画面を上下2分割し、上半分にソースコード、下半分に通常の gdb の入出力画面が表示される | |~|-w |GUI を使用する | | |Operating modes |--configuration |gdb の設定内容の詳細を表示して終了する | | |other |--cd=<dir> |Currente Directory を <dir> にする | | |remote debugging options |-b <BAUDRATE> |serial port の baud rate を指定 | | |~|-l <TIMEOUT> |リモードでバッグにおけるタイムアウトを <TIMEOUT>[sec] に設定する | | ///////////////////////////////////////////////////////////////////////////////// * core file から bcaktrace を見る [#qe040af5] - プログラムが SIGSEGV などのシグナルで死んだ場合に、吐き出された core ファイルを使って、落ちた箇所の特定をする ++ プログラムを実行し、コアダンプが発生する $ ./TestProg CATest::SetEventQueue: [event_queue:0x7ffdf43294e0] Push: [queue_num:01][EVENT_ID:RUN] Pop(2): [queue_num:00][EVENT_ID:01:RUN] Push: [queue_num:01][EVENT_ID:INVALID] Pop(2): [queue_num:00][EVENT_ID:04:INVALID] Trace/breakpoint trap (コアダンプ) ++ gdb を起動。プロンプト "''(gdb)''" が表示される。 $ gdb (gdb) ++ プログラムを読み込む (gdb) file ./TestProg Reading symbols from TestProg...(no debugging symbols found)...done. ++ core ファイルを読み込む (gdb) core-file core [New LWP 15174] [New LWP 15173] [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". Core was generated by `./TestProg'. Program terminated with signal SIGTRAP, Trace/breakpoint trap. #0 0x00007f8f523dc79b in raise (sig=5) at ../nptl/sysdeps/unix/sysv/linux/pt-raise.c:37 37 ../nptl/sysdeps/unix/sysv/linux/pt-raise.c: そのようなファイルやディレクトリはありません. (gdb) ++ backtrace を表示させる (gdb) bt #0 0x00007f8f523dc79b in raise (sig=5) at ../nptl/sysdeps/unix/sysv/linux/pt-raise.c:37 #1 0x0000000000404c47 in SigsegvWorkerThread ( p_args=<error reading variable: can't compute CFA for this frame>) at SigsegvWorkerThread.cpp:63 #2 0x0000000000404abc in std::_Bind_simple<void (*(CSigsegvWorkerThreadArgs*))(CSigsegvWorkerThreadArgs*)>::_M_invoke<0ul>(std::_Index_tuple<0ul>) ( this=<error reading variable: can't compute CFA for this frame>) at /usr/include/c++/4.9/functional:1700 #3 0x00000000004049b5 in std::_Bind_simple<void (*(CSigsegvWorkerThreadArgs*))(CSigsegvWorkerThreadArgs*)>::operator()() (this=<error reading variable: can't compute CFA for this frame>) at /usr/include/c++/4.9/functional:1688 #4 0x0000000000404932 in std::thread::_Impl<std::_Bind_simple<void (*(CSigsegvWorkerThreadArgs*))(CSigsegvWorkerThreadArgs*)> >::_M_run() ( this=<error reading variable: can't compute CFA for this frame>) at /usr/include/c++/4.9/thread:115 #5 0x00007f8f526a0970 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 #6 0x00007f8f523d50a4 in start_thread (arg=0x7f8f51b0a700) at pthread_create.c:309 #7 0x00007f8f51bf387d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:111 (gdb) --- この例では、SigsegvWorkerThread() から呼びだされている raise() で落ちている。(そもそも raise() はそういうことをするための関数なのだが、ここはこういった例示の為のサンプルプログラムなので...) ///////////////////////////////////////////////////////////////////////////////// * 実行形式からデバッグシンボルが分離されている場合 [#c03d2376] - 実行形式とデバッグシンボルが別ファイルになっている場合がある -- クラッキング対策などの理由で、実行形式からデバッグシンボルを strip した場合は、実行形式にデバッグシンボルが全く残っていない。 -- そうはいってもデバッグに困るので、別ファイルにデバッグシンボルのみを保存する場合がある - こうした場合は、実行形式とデバッグシンボルを別々に読み込む ++ 実行形式の読み込み (gdb) file ./TestProg Reading symbols from TestProg...(no debugging symbols found)...done. (gdb) ++ デバッグシンボルファイルの読み込み (gdb) symbol-file TestProg.sym Load new symbol table from "TestProg.sym"? (y or n) y Reading symbols from TestProg.sym...done. (gdb) - ここまで出来たら、core ファイルを読み込んで解析したり、或いは break で break point を張って run でデバッグ実行したりする。 ///////////////////////////////////////////////////////////////////////////////// * debug 実行 [#c2b991e4] ** コマンド [#ne4a16a8] - break -- 書式 bt [file:]function bt [file:]line - run [arg...] -- プログラムのデバッグ実行開始 -- 引数をつけると、それがそのままプログラムに渡される。 - step -- 次の行を実行 -- その行に関数が含まれている場合は、関数の中で step 実行する。 - next -- 次を実行 -- その行に関数が含まれている場合は、関数を全て 1 step で実行する。 - continue -- 最後まで実行する - print <variable> -- プログラム中の変数 <variable> の値を表示する。 - list -- 現在中断している場所の周辺のプログラムコードを表示する。 - bt -- backtrace の表示。 - info -- 各種情報の表示 info breakpoints: 現在設定されている breakpoint の一覧