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

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

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. 文章書くのって体力が必要だね!

ひとりごと+自己紹介

どうも、platypusです。

 

先日情報オリンピックという学生向け競技プログラミング大会の予選を通過しまして、(すごい希望的観測ですが)合宿にも行きたいと思っているただのプログラマーです。意気込みだけは他の人並みにあると思います。

 

思い返せば、半年ほど前にTwitterを使い始めてからすごく成長したと感じます。競技プログラミングのおかげで、普段プログラミングをするときもよりコードを身近に感じるようになりました。実装力も普通のプログラマー並にはつき、C++がすこしだけ「母国語」のようになった気がします。(ただ肝心の日本語はどんどん抜けていきますが...)最近はgccや各種CUIエディタに触れ、いかに統合開発環境を使っていた自分が本質を理解していなかったかを痛感しました。

 

しかしながら、最近練習し始めたvimgdbでも、自分が1日かけて全くわからなかったことを試しにつぶやいてみると、1分も立たないうちに先輩方が丁寧な説明をリプライしてくださって、尊敬すると同時に、いかに自分がまだまだなのかを深く感じました。少し焦る中、もっと努力をしなければ、と自分を奮い立たせるいい機会にもなりました。

 

そこで精進の一環として、自分の気が向いた時にブログを書いてみようかなと思います。本当に気が向いた時だけなので、この文章でこのブログの最後の記事になってしまうかもしれません。むしろ早く強くなって、今度は他の人たちに知識を授ける側になりたいと思っています。いわゆる日記と備忘録の中間点みたいなやつです。

 

さて、そろそろみなさんもブラウザバックしている頃でしょうが、自己紹介と行きます。自分は確か3年ほど前に学校のコンピューター部に入り、C++とDxLibを使ったゲームプログラミングをはじめました。競技プログラミングはそれに比べて本当に最近で、AtCoder最古のAC記録は去年の2/22でした。まだ一年も経っていません。

 

最近はJOI本選のためにUbuntuという(自分にとって)謎のOSを使って、これまた(自分にとって)謎のソフトたちであるvimgccgdbなどを練習しています。AtCoderやたまーにCodeforcesTopCoderなどのオンラインの大会にも頑張って出場しています。そのせいで、というわけではないのですが、最近は全くゲームプログラミングをしていません。でも文化祭までに一つ作品を作ったほうが良さげなので、構想だけは頭の中に入っています。

 

うーん、自己紹介というよりかは近況報告のようになってしまいましたが、以上です。これからは何卒よろしくお願いいたしますm(_ _)m

 

 

P.S. この文章にある微妙な臭さをどうにかしたい...