Prog/debug/gdb
の編集
[
トップ
] [
編集
|
差分
|
履歴
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
App
App/archiver
App/audio
App/audio/audacity
App/audio/mpg321
App/audio/puddletag
App/base64
App/Browser
App/column
App/diff-patch
App/downloader
App/ffmpeg
App/ffprobe
App/find
App/gimp
App/gnuplot
App/ImageMagick
App/info
App/inxi
App/LibreOffice
App/locate
App/md5
App/Music
App/Music/frescobaldi
App/Music/MuseScore
App/OCR
App/od
App/OpenOffice.org
App/pagers
App/pdf
App/QRコード
App/ripgrep
App/screen
App/script
App/sed
App/selenium
App/signal-desktop
App/skype
App/sylpheed
App/tmux
App/ttyrec
App/uniq
App/UUID
App/wget
App/xargs
App/テキスト処理
App/仮想化
App/仮想化/Docker
App/仮想化/qemu
App/仮想化/webos
AutoTicketLinkName
BracketName
CentOS
CentOS/yum
CrossCompile
Debian
Debian/kernel
Debian/kernel/ver8-or-older
Debian/Plan9関連
Debian/ver5
Debian/ver6
Debian/ver7
Debian/ver8
Debian/ver9
Debian/ver10
Debian/ver11
Debian/ver12
Debian/X
Debian/X/日本語
Debian/パッケージ管理
Deveice/Sensor/MotionSensor
Device
Device/Mouse
Device/Net/wifi
Device/Scanner
Device/Sensor
Device/Sensor/MotionSensor
Device/tty
Device/xmodmap
Editor
Editor/atom
Editor/binary
Editor/binary/beav
Editor/binary/hexedit
Editor/emacs
Editor/emacs/clang-format
Editor/emacs/flycheck
Editor/emacs/gdb-mode
Editor/emacs/github/copilot
Editor/emacs/html-mode
Editor/emacs/lisp
Editor/emacs/lsp-mode
Editor/emacs/markdown-mode
Editor/emacs/neotree
Editor/emacs/package-install
Editor/emacs/sdic
Editor/emacs/speedbar
Editor/emacs/XEmacs
Editor/emacs/ローカルビルド
Editor/emacs/多言語
Editor/fte
Editor/vi
FormattingRules
FrontPage
Help
InterWiki
InterWikiName
InterWikiSandBox
iPhone
Lang
Lang/C++
Lang/C++/Boost
Lang/C++/C++11
Lang/C++/C++11/thread
Lang/C++/C++11/コンテナ
Lang/C++/C++11/コンテナ/string
Lang/C++/C++11/初期化子
Lang/C++/C++17
Lang/C++/C++20
Lang/C++/error
Lang/C++/macro
Lang/C++/template
Lang/C++/コンテナ
Lang/C++/処理系
Lang/C-Sharp
Lang/Go
Lang/html
Lang/html/5
Lang/html/5/canvas
Lang/html/css
Lang/Java
Lang/Java/jar
Lang/Objective-C
Lang/Pascal
Lang/Perl
Lang/Perl/CGI
Lang/Perl/thread
Lang/Perl/utf-8
Lang/pike
Lang/Python
Lang/Python/Class
Lang/Python/Error
Lang/Python/import対象パス
Lang/Python/pip
Lang/Python/基本文法
Lang/Python/開発環境
Lang/Rust
Lang/sed
Lang/shell
Lang/shell/bash
Lang/shell/bash/設定
Lang/shell/bash/設定/command-not-found
Lang/Tcl_Tk_Expect
Lang/Tcl_Tk_Expect/Ctrl-キーマップ
Lang/TypeScript
Lang/xml
Mac
Memo
memo
MenuBar
midi
Multimedia
Net
Net/apache
Net/apache2
Net/dig
Net/dns/server
Net/domain
Net/http/アクセス制御
Net/iptables
Net/IRC
Net/Jenkins
Net/lighttpd
Net/mail
Net/mail/X-Face
Net/news
Net/news/gnus
Net/ntp
Net/pukiwiki
Net/pukiwiki/plugin
Net/resolv.conf
Net/SPAM
Net/ss
Net/tcpdump
Net/traceroute
Net/twitter
Net/vpn
Net/web
Net/webAPI
Net/wifi
Net/wifi/AP
Net/監視
otherlinks
PHP
Plan9
PPC
PPC/LinuxPPC
PPC/MkLinux
Prog
Prog/AI
Prog/autotools
Prog/cmake
Prog/Compiler/gcc
Prog/CrossReferencer
Prog/debug
Prog/debug/gdb
Prog/debug/lldb
Prog/debug/ltrace
Prog/debug/memory
Prog/debug/strace
Prog/formatter/clang-format
Prog/GoogleTest
Prog/Gtk
Prog/IDE
Prog/IDE/Geany
Prog/ldd
Prog/make
Prog/nm
Prog/Profiler
Prog/Qt
Prog/readelf
Prog/Sound
Prog/StaticCodeAnalysis
Prog/StaticCodeAnalysis/cppcheck
Prog/strip
Prog/TagSystem
Prog/TagSystem/cscope
Prog/TagSystem/ctags-exuberant
Prog/TagSystem/ebrowse
Prog/TagSystem/etags
Prog/TagSystem/gtags
Prog/TagSystem/id-utils
Prog/TagSystem/lctags
Prog/TagSystem/rtags
Prog/TagSystem/SilentBob
Prog/X/X11
Prog/プロセス間通信
Prog/プロセス間通信/SharedMemory
Prog/プロセス間通信/singal
Prog/人為的なシグナル
Prog/分散ビルド/distcc
Prog/逆アセンブル
PukiWiki
PukiWiki/1.4
PukiWiki/1.4/Manual
PukiWiki/1.4/Manual/Plugin
PukiWiki/1.4/Manual/Plugin/A-D
PukiWiki/1.4/Manual/Plugin/E-G
PukiWiki/1.4/Manual/Plugin/H-K
PukiWiki/1.4/Manual/Plugin/L-N
PukiWiki/1.4/Manual/Plugin/O-R
PukiWiki/1.4/Manual/Plugin/S-U
PukiWiki/1.4/Manual/Plugin/V-Z
RecentDeleted
RS232C
SandBox
Security
Security/aide
Security/chkrootkit
Security/clamav
Security/gpg
Security/pkcs
Security/ssh
Security/test
Security/パスワード解析
System
System/Audio
System/beep
System/bluetooth
System/cpu
System/dm-crypt
System/fs
System/fs/ext2-3
System/fs/mount
System/fs/nfs
System/fs/tmpfs
System/fs/xfs
System/fs/大容量のファイルを高速に作成する
System/fs/強制物理フォーマット
System/grub
System/Hardware情報
System/HDD/IDE/チューニング
System/input
System/iostat
System/Kernel
System/Kernel/Module
System/locale
System/memory
System/OpenCL
System/os
System/power/battery
System/Process
System/random
System/rpm
System/runlevel
System/signal
System/sudo
System/swap
System/USB-Boot
System/user
System/シリアル接続
System/環境変数
TeX
TeX/MusiXTeX
tools
Top/Editor/emacs/python開発環境
transcription/old
Ubuntu
VersionCtl
VersionCtl/git
VersionCtl/git/Gerrit
VersionCtl/git/Gerrit/old
VersionCtl/git/git-gutter+
VersionCtl/git/git-imerge
VersionCtl/git/magit
VersionCtl/git/magit/2.1.0
VersionCtl/git/magit/2.8.0
VersionCtl/git/magit/2.13.1
VersionCtl/git/magit/v3.2.1
VersionCtl/git/magit/v3.3.0
VersionCtl/git/subversion からの移行
VersionCtl/git/subversion とのコマンド対比
VersionCtl/git/tig
VersionCtl/git/統計
VersionCtl/hg
VersionCtl/Mercurial
VersionCtl/repo
VersionCtl/Subversion
WikiEngines
WikiName
WikiWikiWeb
Windows
Windows/cmd
X
X/DisplayManager
X/DisplayManager/gdm3
X/DisplayManager/lightdm
X/font
X/font/old
X/GNOME3
X/input
X/input/OnScreenKeyboard
X/input/キーアサインを変更する
X/input/グラゴル文字
X/input/日本語
X/input/日本語/ATOK X3
X/input/日本語/ibus
X/input/日本語/uim
X/KDE
X/remote
X/screensaver
X/terminal
X/terminal/mlterm
X/terminal/urxvt
X/terminal/uxterm
X/vnc
X/vnc/tigervnc
X/WindowManager
X/WindowManager/9wm
X/WindowManager/amiwm
X/WindowManager/awesome
X/WindowManager/CDE
X/WindowManager/cinnamon
X/WindowManager/dwm
X/WindowManager/flwm
X/WindowManager/i3
X/WindowManager/jwm
X/WindowManager/matchbox
X/WindowManager/MATE
X/WindowManager/mlvwm
X/WindowManager/qvwm
X/WindowManager/ratpoison
X/WindowManager/ude
X/WindowManager/WindowMaker
X/WindowManager/xfce4
X/xdotool
X/Xnest
X/xrdp
X/xvfb
YukiWiki
スタジオ・ホール
旅
旅/Czech
旅/三重
旅/京都・滋賀
旅/兵庫
旅/千葉
旅/各務
旅/和歌山
旅/埼玉
旅/山形
旅/岐阜
旅/岡山
旅/岩手
旅/島根
旅/愛媛
旅/新潟
旅/東京
旅/栃木
旅/神奈川
旅/秋田
旅/群馬
旅/茨城
旅/長野・山梨
旅/静岡
旅/静岡/伊豆
未整理
食
食/チェコ
食/各国
食/料理
食/激辛
食/蕎麦
食/郷土料理
#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] に設定する | | |batch |-batch |バッチ処理モードで起動。 | | |batch |-x <command-file> |バッチ処理モードで実行する gdb のコマンドファイルを指定する。 | | ///////////////////////////////////////////////////////////////////////////////// * 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, b <break-point> -- breakpoint を指定する -- breakpoint には、下記を指定する ファイル名:行番号 シンボル名(関数名) アドレス - backtrace -- バックトレースを表示する -- 書式 bt [file:]function bt [file:]line - run [arg...] -- プログラムのデバッグ実行開始 -- 引数をつけると、それがそのままプログラムに渡される。 - step, s -- 次の行を実行 -- その行に関数が含まれている場合は、関数の中で step 実行する。 - stepi, si -- 次の行を実行 -- 次の行が関数呼び出しである場合、その関数を実行して抜けた直後で止まる。(即ち、その関数の中では止まらない) - next, n -- 次を実行 -- その行に関数が含まれている場合は、関数を全て 1 step で実行する。 - continue -- 次の breakpoint まで実行する。もし次の breakpoint がない場合、プログラムの最後まで実行する。 - print, p <variable> -- プログラム中の変数 <variable> の値を表示する。 - printf <format>, <variable> [,<variable2> [, ...]] -- プログラム内の変数を <format> に従った書式で表示する (gdb) printf "[id:%d][address: %p]\n", i, address_array[i] - list, l -- 現在中断している場所の周辺のプログラムコードを表示する。 -- 表示領域を指定したい場合は、引数に開始行番号と終了行番号を半角コンマで区切って渡す。 (gdb) l <start-line-no>,<end-line-no> - info -- 各種情報の表示 -- info breakpoints: 現在設定されている breakpoint の一覧 -- info locals : ローカル変数の一覧 -- info thread(s) : スレッドの一覧 //=============================================================================== ** break point の保存・読み出し [#x850b805] - save -- save breakpoints <file-name> : 設定した breakpoint を <file-name> に保存する -- save gdb-index -- save tracepoints - source -- save コマンドで保存したファイルを読み込む -- source <file-name> : <file-name> を読み込む。 ///////////////////////////////////////////////////////////////////////////////// * 無反応になったプログラムの状態を調べる [#ra57a878] + 現在の状態を調べるため、現在の状態を core に吐かせて終了させる $ kill -ABRT <PID> または~ $ kill -6 <PID> + 出力された core を解析すると、上記 kill でシグナルを送られたときの状態を確認できる。 ///////////////////////////////////////////////////////////////////////////////// * マルチスレッドプログラムの解析 [#k0c18a6e] - info thread -- スレッドの一覧を表示。core の解析時にも使える -- 現在選択されているスレッドのエントリの左端に "*" が表示される。 - thread <ThreadID> -- 解析したい スレッドを選択する - 選択中のbacktrace (bt), frame, info などのコマンドを普通に使って解析することが出来る。 ///////////////////////////////////////////////////////////////////////////////// * batch 処理 [#yeac6740] - コマンドを自動実行することが出来る。 - core dump の解析である程度使用するコマンドが決まっている場合に使える。 ** 使い方 [#dc2c4c71] + コマンドを記述したテキストファイルを用意する -- 例 $ vi command.gdb info thread thread 2 info locals + core を解析する $ gdb ${PROGRAM_FILE} -c core -batch -x <command-file> + 結果が出力される -- このとき、<command-file> に記述された途中のコマンドでエラーになった場合、それに続くコマンドは実行されることなく、gdb は処理を終了する。 ///////////////////////////////////////////////////////////////////////////////// * フロントエンド [#front-end] //=============================================================================== ** ddd [#ddd] - GUIデバッガ。「gdb を使わなければならないが CUI が苦手」という人にとっては、gdb を直接触るよりも多少マシかも知れない。 //=============================================================================== ** xxgdb [#xxgdb] - GUIデバッガ。 ddd とほぼ同等の機能を有するが、ddd よりは軽量。 //=============================================================================== ** eclipse [#eclipse] - IDE の一種。 - デバッグ実行機能として gdb を使用する。 ///////////////////////////////////////////////////////////////////////////////// * core file [#be3d20b9] - core file が出力されない場合は、 ulimit コマンドでユーザリソースの設定を変更する(bashの場合) - まずは確認 $ ulimit -c 0 - 設定する -- ${HOME}/.bashrc に以下を記述 ulimit -c unlimited -- core のサイズを制限したければ、 "unlimited" の代わりにブロックサイズ値を指定することが出来る。しかしその場合、core の情報がその上限値によって制限され、gdb での debug 時に支障をきたす可能性がある。
#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] に設定する | | |batch |-batch |バッチ処理モードで起動。 | | |batch |-x <command-file> |バッチ処理モードで実行する gdb のコマンドファイルを指定する。 | | ///////////////////////////////////////////////////////////////////////////////// * 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, b <break-point> -- breakpoint を指定する -- breakpoint には、下記を指定する ファイル名:行番号 シンボル名(関数名) アドレス - backtrace -- バックトレースを表示する -- 書式 bt [file:]function bt [file:]line - run [arg...] -- プログラムのデバッグ実行開始 -- 引数をつけると、それがそのままプログラムに渡される。 - step, s -- 次の行を実行 -- その行に関数が含まれている場合は、関数の中で step 実行する。 - stepi, si -- 次の行を実行 -- 次の行が関数呼び出しである場合、その関数を実行して抜けた直後で止まる。(即ち、その関数の中では止まらない) - next, n -- 次を実行 -- その行に関数が含まれている場合は、関数を全て 1 step で実行する。 - continue -- 次の breakpoint まで実行する。もし次の breakpoint がない場合、プログラムの最後まで実行する。 - print, p <variable> -- プログラム中の変数 <variable> の値を表示する。 - printf <format>, <variable> [,<variable2> [, ...]] -- プログラム内の変数を <format> に従った書式で表示する (gdb) printf "[id:%d][address: %p]\n", i, address_array[i] - list, l -- 現在中断している場所の周辺のプログラムコードを表示する。 -- 表示領域を指定したい場合は、引数に開始行番号と終了行番号を半角コンマで区切って渡す。 (gdb) l <start-line-no>,<end-line-no> - info -- 各種情報の表示 -- info breakpoints: 現在設定されている breakpoint の一覧 -- info locals : ローカル変数の一覧 -- info thread(s) : スレッドの一覧 //=============================================================================== ** break point の保存・読み出し [#x850b805] - save -- save breakpoints <file-name> : 設定した breakpoint を <file-name> に保存する -- save gdb-index -- save tracepoints - source -- save コマンドで保存したファイルを読み込む -- source <file-name> : <file-name> を読み込む。 ///////////////////////////////////////////////////////////////////////////////// * 無反応になったプログラムの状態を調べる [#ra57a878] + 現在の状態を調べるため、現在の状態を core に吐かせて終了させる $ kill -ABRT <PID> または~ $ kill -6 <PID> + 出力された core を解析すると、上記 kill でシグナルを送られたときの状態を確認できる。 ///////////////////////////////////////////////////////////////////////////////// * マルチスレッドプログラムの解析 [#k0c18a6e] - info thread -- スレッドの一覧を表示。core の解析時にも使える -- 現在選択されているスレッドのエントリの左端に "*" が表示される。 - thread <ThreadID> -- 解析したい スレッドを選択する - 選択中のbacktrace (bt), frame, info などのコマンドを普通に使って解析することが出来る。 ///////////////////////////////////////////////////////////////////////////////// * batch 処理 [#yeac6740] - コマンドを自動実行することが出来る。 - core dump の解析である程度使用するコマンドが決まっている場合に使える。 ** 使い方 [#dc2c4c71] + コマンドを記述したテキストファイルを用意する -- 例 $ vi command.gdb info thread thread 2 info locals + core を解析する $ gdb ${PROGRAM_FILE} -c core -batch -x <command-file> + 結果が出力される -- このとき、<command-file> に記述された途中のコマンドでエラーになった場合、それに続くコマンドは実行されることなく、gdb は処理を終了する。 ///////////////////////////////////////////////////////////////////////////////// * フロントエンド [#front-end] //=============================================================================== ** ddd [#ddd] - GUIデバッガ。「gdb を使わなければならないが CUI が苦手」という人にとっては、gdb を直接触るよりも多少マシかも知れない。 //=============================================================================== ** xxgdb [#xxgdb] - GUIデバッガ。 ddd とほぼ同等の機能を有するが、ddd よりは軽量。 //=============================================================================== ** eclipse [#eclipse] - IDE の一種。 - デバッグ実行機能として gdb を使用する。 ///////////////////////////////////////////////////////////////////////////////// * core file [#be3d20b9] - core file が出力されない場合は、 ulimit コマンドでユーザリソースの設定を変更する(bashの場合) - まずは確認 $ ulimit -c 0 - 設定する -- ${HOME}/.bashrc に以下を記述 ulimit -c unlimited -- core のサイズを制限したければ、 "unlimited" の代わりにブロックサイズ値を指定することが出来る。しかしその場合、core の情報がその上限値によって制限され、gdb での debug 時に支障をきたす可能性がある。
テキスト整形のルールを表示する