読者です 読者をやめる 読者になる 読者になる

とりになりたいかものはし

プログラミング(主に競プロ)に関するひとりごとなど

GDB+DDD

JOI本選で何が一番辛いかというと、やはり普段使い慣れているソフトが入っていないことでしょうか。僕は普段Visual StudioWindowsの上でほんわかと使っているのですが、そんな贅沢な環境で暮らしているひ弱なかものはしにとってUbuntu+最低限のエディタ+gccオンリーというのはまるで冬の雪山のど真中に捨てられたような気分です。(昨日ようやくこの小さい記号~(チルダというらしいです)がホームディレクトリであることを知りました。)そんなLinux初心者ですが、今日は過酷な環境の中で唯一の命綱と言ってもいいほどありがたいソフトであるDDDを取り上げようと思います。

 

DDDってどんなもの?

DDDとはData Display Debuggerの略で、gdbというCUIのデバッガーソフトをGUI化したものらしいです。アイコンは蜘蛛を虫眼鏡で覗いている画像です。初期配置では左側のメニューの上から6つ目にあります。

早速開いてみましょう。おお、何やらTips of the day(今日の豆知識 的な?)が出てきましたね。でも英語なのでそっとじ。ソフトを起動するたびに出てくるので、煩わしければ設定でオフにできます。

とりあえず画面の見方から。上からメニューバー、ツールバー、データウィンドウ、ソースウィンドウ、デバッガーコンソールがあります。一番下のデバッガーコンソールはCUIであるgdbのコマンドがそのまま使えるので、もう知っているという人はそちらからパチパチうってくださいな。

基本操作

ではデバッグをしてみましょう!まず、gcc「-g -O0」オプションデバッグ情報付き、最適化なしのコンパイル)をした出力ファイルを読み込ませましょう。メニューバーのFile→Open Programから出すことができます。この時、絶対にファイルやパスなどに日本語が含まれていないようにしてください!DDDは何故か日本語との相性がとても悪く、アイコンやブレークポイントの位置表示がバグったり、ファイルを開けなくなったりします。一応日本語でも動かないことはないらしいですが、コメントも極力半角文字で済ませましょう。

開くと、ソースウィンドウにはソースコードが表示されるはずです。右側の行数字を右クリックしてSet Breakpointでブレークポイントをつけることができます。さらに右クリックでPropertiesを選択すると条件付きにしたり、通るたびにコマンドを実行させることもできます。使えたら強そうですね。ブレークポイントが置けない!or正しく動作しない!という人はもう一度gccコンパイルオプションをチェックしてみましょう。

実行をするには、メニューバーのProgram→Runをクリックしましょう。そこでArgumentsの指定ができるので、例えばここに「<~/in.txt」などと入力すれば、ホーム直下にあるin.txtを標準入力にリダイレクトしてくれます。またそのまま実行すると出力は下のデバッガーコンソールに表示されて割と見難いので、Program→Run in Execution Windowにチェックを入れて実行画面を表示させましょう。ちなみに、実行画面を閉じてしまうとこのオプションのチェックも外れるという謎の仕様があるので、一度出したらなるべく消さないほうがいいと思います。

せっかくなので付属の小さいウィンドウのボタンも紹介します。Runは前述の通りプログラムを最初から実行させます。Interruptは処理を中断させます。Stepはステップイン、Nextはステップオーバーです。Stepi,Nextiはどうやら機械語に沿った動きをするようです。(いらない)Continueは一度止めた処理の再開、Killは処理の終了です。

変数表示

ここからが今日の本題です!ブレークポイントをつけて適当なところで処理を止めましょう。その状態でカーソルを変数の上に置くと、変数の中身が表示されます。ダブルクリックまたは右クリック→Displayとするとデータウィンドウに変数が常に表示されるようになります。配列はもちろん、文字列や構造体も表示できます。変数の中身が大きすぎる場合、データウィンドウ上で省略される場合があります。その場合はクリック→Show allすると良いでしょう。

ツールバーの空白に変数名を入れて、右側のPrintボタンを押すと下のデバッガーコンソールに結果が表示されます。それならDisplay機能で間に合ってる、ですか?いえいえ、このツールバーなんと変数だけでなく式や関数も処理してくれるスグレモノなのです!試しに例えば変数a,bがあるとき、「a==b」と入力してPrintすればtrueまたはfalseと出力され、例えば関数dpがあったとして「dp(2,3)」と入力すればその戻り値がキチンと出力されます!(この時、戻り値を取得するために関数を実行しているので、2重処理には注意してください)また、変数の中身を変えることも出来ます!代入式を入力し、Setボタンを押すと値が変更されます。本当にやりたい放題ですね。

終わりに

あとは煮るなり焼くなりです!DDDは上記以外にもユーザー定義コマンドや簡易マクロなどのVisual Studioに匹敵するような機能も持ち合わせています。癖があり慣れるのに少し時間がかかりますが、しっかりと使いこなしてJOI本選という真冬の嵐を乗り越えましょう!

 

 

P.S. 文章書くのって体力が必要だね!