OCamlでocamldebugを使う

研究の関係上、とあるOCamlのプロジェクト――いえ、まあ、とあるもなにも、Coqだが――をいじる必要が出た。
そんなにプログラミング・・・というかプロジェクトの読み解きなどをやったことがない私は、途方にくれ・・・まではしなかった。
運がいいことに、先輩から「そういうときはデバッガで追いながら読めばいいよ」というアドバイスを受けたことがあったからだ。
さすが先輩。先達はあらまほしきことなり。


で、デバッガを使うためにいろいろ調べながらやった結果知ったこと。
いまいちまとまった情報が見当たらない気がしたので、軽くメモ代わりにでも、と思った次第。

ocamldebugはバイトコードしか対応してない

明記してる人があまりいないのではっきりと。
OCamlには二つのコンパイラ、ocamlcとocamloptがある*1
前者がバイトコード(+VM?)へのコンパイラ、後者がネイティブコードへのコンパイラ
どちらにもオプションとして-gが存在する。
だが、この二つのコンパイラでは、-gの説明がわずかだが異なる。
前者ではdebuggerと言う単語が陽に出てくるが、後者は出てこない。
というか対応してない。
現にocamloptでコンパイルしたプログラムをocamldebugに読み込ませると「対応したバイトコードじゃない」といってくる。
早く言ってくれ。
ちなみにocamloptの-gオプションは「例外をキャッチし損ねたときにスタックトレースを出したりする」のに使われるらしい。
デバッガ用オプションではない。

ocamldebugは元のソースコードが必要

絶対必要かまでは断言できないが、まずブレイクポイントが設定できない。
多くの解説ではソースコードがある環境で、ちょこちょこっとemacsでデバッガを動かしているのでよくわからない。
私のケースでは、プロジェクトの中を見ようとしている以上、バイナリとソースコードは全然違う場所にあるし、どちらも今自分のいるフォルダにはなかったりする*2
そしてブレイクポイントを設定しようとしたら「ソースコードがないよ」なんていわれる始末だ。
最初本気で何を言っているのかわからなかった。


ocamldebugにソースコードのあるフォルダを教えるオプションは-I。
ocamldebug -I toplevel bin/coqtop.byte -coqlib .
とかすると、「toplevelというフォルダをソースコード探索の対象に含め、binフォルダのcoqtop.byteを-coqlib .というオプションをつけてデバッグする」という形になる。
ocamldebugに渡すオプションは対象のプログラムの前。後ろは全て対象のプログラムのオプション。

ついでに:dumpobj

最初はデバッガの動かし方に四苦八苦したせいで、そもそもデバッグ情報が入ってるかすら怪しく感じ始めた。
そのため、まずその情報を見てみたくなった。
調べてみたらdumpobjというものがあるとかいう。
シェルに打ち込んでもそんなコマンドはないという。
なるほど、apt程度では入らないということか?仕方ない、自分でビルドしてインストールしよう。
した結果:make installしたらocamldumpobjという名前で入っていた。
名前変えるのか!?
早く言ってくれ。
実は入ってたりしたんじゃなかろうな*3


これで読み進められ・・・るといいな、と思っている。
散文になってしまったが、以上である。

*1:誰かが作った独自実装などの話はしてないのであしからず。

*2:makeするフォルダにいる場合。

*3:Ubuntuにて確認。OCamlをインストールすると入る。