All articles in GDB

watch

変数値の変化を追跡できるとうれしいかもしれない.変数値の追跡 変数値の追跡 ソースの何行目かはわからないが,とにかくある変数の値がいつ参照されたり書き込まれたかを示すことができる.以下にまずソースを示す. 1: #include2: #include 4: int main(void)5: {6: int i = 0;7: int j = 0; 9: i++;10: … More watch

プロファイル(gcc)

2003-07-20T15:13+09:00 matsuプログラムのパフォーマンスを効率的にあげるには,多く呼び出される関数や一番重い処理をする関数をチューニングする必要がある.ここではgccのプロファイルという機能を用いて呼び出し回数や実行時間を調べるための方法を書く.gcc -pg例 gcc -pg 方法はズバリ-pgでgccしてプログラムを実行するとファイルgmon.outが出力される.そしてgprofを実行するとプログラム中の各関数の実行時間や呼び出し回数等が表示される. 例

とにかくちょっと使ってみる

gdbをとにかくちょっと使ってみた.準備gdbの起動から終了まで別の実行方法Shellコマンド注意点 準備 gdbはどんな風に使用するのか,簡単な使用方法を通して示してみたい.まず以下のようなソースがあるとする. gdbの起動から終了まで 別の実行方法 Shellコマンド gdbのプロンプトでShellコマンドを実行することができる.(gdb) shell echo hogehogeまた,Shellモードになったりもできる.(gdb) shell$ exitexit(gdb) 注意点

attach

なんらかの理由でgdbからいきなり起動できないプログラムや,今運用環境で動いているプログラムをデバッグしたい場合などには,動いているプロセスにattachしてデバッグすることができる.こんな場合にサンプルプログラムattachまでの3手順attach後はどうするんだ? こんな場合に attachは以下のような場合に重宝するのではないだろうか.起動手順が複雑で,起動用のスクリプトなどを使用しないと(現実的に)起動できないプロセス.運用中のプロセスのコアを取りたい.運用中のバグが出たが該当プロセスだけど止めることができない. サンプルプログラム では以下のサンプルプログラムを起動し,実際にattachしてみる. include include intmain(int argc, char *argv[]){int sleepSecond; if (argc > 1){sleepSecond = atoi(argv[1]);}else{sleepSecond = 1;} … More attach

プログラムのフロー(cflow)

ctagsやetagsなんてすごいものがあるんだから,これぐらいできるだろうと思っていたら,やっぱりあった.cflowはある関数がどんな関数をコールするかを解析して表示してくれる.すなわちプログラムのフローを表示してくれる.cflowは結構古くからあるらしく,いろんな実装があるが,今回もcflow_2.0-15_i386.deb(これで一意に特定できるのかな?)を使用する.さっそく使ってみる解析階層の指定解析対象関数の指定登場関数一覧デバッグ用 さっそく使ってみる 解析階層の指定 解析対象関数の指定 登場関数一覧 デバッグ用

GDBによるテスト自動化への試み

…GDBの機能を使用すると,テストを自動化できないだろうか…そんな疑問がよぎったのでちょっと試してみた.はじめに基本方針デバッガによるテスト自動化へ向けてコマンドファイルの作成量産もう一越え はじめに まず,最初にこの頁はCによる開発を前提にしていることを断っておく.テストというと,最終的には実際に出来上がったものを対象に外部使用をチェックすることになる.しかし,そこに至るまでに関数単位でのテストをボトムアップでやっておかないと,障害の切り分けが繁雑になったり,モノができあがってから「この関数に問題があるので全体の構造をかえる必要がある」なんてことがわかっても困る.ということで,この頁では関数単位のテスト,すなわち関数の呼び出しとその結果のチェックを自動化することを目指してみる. 基本方針 残念ながらテストの自動化といっても,全てが自動なわけではなく,テストを自動的に行なってくれる何かを作成することになる.それはテスト対象とリンクされるプログラムかもしれないし,外部から入出力をチェックするスクリプトかもしれない.ここでは,GDBのコマンドファイルを使用する.入門編でも触れたが,このファイルには通常GDBのプロンプトから入力するコマンドの並びが記述されている.GDBは起動時に.gdbinitファイルがあればそれを実行する.もしくは-xで指定したファイルを実行する.あるいはGDBのプロンプトでsource コマンドファイルとすることで実行させたりもできる.今回はこのコマンドファイルでテストを自動化しようと思う.メリットは,ソースを汚さない問題が検出されて自動テストが停止したとき,そこはもうデバッグ環境である.こんなところだろうか. デバッガによるテスト つまらないものですが,テスト対象のサンプル. 自動化へ向けて さて,前節のテストを自動化するためには何が必要だろうか.デバッガに手動でコマンドを打ち込んだ場合には,getCodeの返り値を目で確認していた.したがって,getCodeに修正が入って次にテストするときにもまた目で確認する必要がある.これを自動化したい.もう一度やってみる.(gdb) call getCode (1)$1 = 0x804869b “HOGE”このとき(gdb) print $$2 = 0x804869b … More GDBによるテスト自動化への試み

GDB

GDBの使い方を調べてみた.将来的にはデバッガを使えるようになって効率的な開発をしていくのだ.入門編応用編GDBじゃないけど……入門編基本的なGDBの使い方とにかくちょっと使ってみる2003-07-20T15:13+09:00 matsugdbをとにかくちょっと使ってみた.breakポイント2003-07-20T15:13+09:00 matsuおそらく多くのデバッグ作業はbreakポイントとステップ実行で足りるものではないだろうか.ここではbreakポイントの設定方法を中心に記述する.breakポイントはいろんな方法で指定できるようだ.watch2003-07-20T15:13+09:00 matsu変数値の変化を追跡できるとうれしいかもしれない.continueとステップ実行2003-07-20T15:13+09:00 matsubreakした後処理を続けるにはcontinueで継続実行するか,step実行する.スタック2003-07-20T15:13+09:00 matsuJavaのExceptionクラスのprintStackTrace()は重宝する.で,gdbを使用するとCでもそれができる.シグナル2003-07-20T15:13+09:00 matsugdbではシグナルの制御もできる.ソースの表示2003-11-24T01:06+09:00 matsugdbからソースを表示できると嬉しい.GNU Emacsのgdbモード(?)を使用するとすごく便利でカッチョイイのだが,どのマシンにもGNU Emacsがあるとは限らないので,そんなときのためにソースの表示方法を示しておく.データの表示2003-07-20T15:13+09:00 matsuデータの表示ができないとデバッグもままならないしれない.処理を変更する2003-07-20T15:13+09:00 matsuデバッグ上で処理を変更してうまくいったらソースに反映する,なんてできると嬉しい.コマンド定義と初期化ファイル2003-07-20T15:13+09:00 matsu複数のgdbコマンドをまとめて定義したりgdb起動時に初期化ファイルに書いたコマンドを実行したりするとうれしい.コア2003-10-25T13:00+09:00 matsu多くのシステムにはgcoreというコマンドがあって,それを使用すると指定したプロセスのコアファイルを取得できるらしい.GNU/Linuxシステム(少なくとも私のマシン)には,gcoreはないが,gdbを使用すると容易にコアファイルを取得できる.さらにgdbにコアファイルを渡すことで,ダンプ時点のプロセスの状態を調べることができる.応用編入門編の事柄を踏まえて,GDBを使い込んでみたい.GDBによるテスト自動化への試み2004-01-20T23:45+09:00 matsu…GDBの機能を使用すると,テストを自動化できないだろうか…そんな疑問がよぎったのでちょっと試してみた.attach2003-11-29T21:00+09:00 matsuなんらかの理由でgdbからいきなり起動できないプログラムや,今運用環境で動いているプログラムをデバッグしたい場合などには,動いているプロセスにattachしてデバッグすることができる.GDBじゃないけど……GDBとは直接関係ないが,デバッグに役立ちそうなTIPsプロファイル(gcc)2003-07-20T15:13+09:00 matsuプログラムのパフォーマンスを効率的にあげるには,多く呼び出される関数や一番重い処理をする関数をチューニングする必要がある.ここではgccのプロファイルという機能を用いて呼び出し回数や実行時間を調べるための方法を書く.プログラムのフロー(cflow)2003-11-08T13:20+09:00 matsuctagsやetagsなんてすごいものがあるんだから,これぐらいできるだろうと思っていたら,やっぱりあった.cflowはある関数がどんな関数をコールするかを解析して表示してくれる.すなわちプログラムのフローを表示してくれる.cflowは結構古くからあるらしく,いろんな実装があるが,今回もcflow_2.0-15_i386.deb(これで一意に特定できるのかな?)を使用する.