<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ものぐさ備忘録 &#187; Ocaml</title>
	<atom:link href="http://www.ginriki.net/wd/category/ocaml/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ginriki.net/wd</link>
	<description>ソフトウェア関係の話を中心とした備忘録的日記</description>
	<lastBuildDate>Sun, 16 Jan 2011 20:07:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ocamldebugの調査</title>
		<link>http://www.ginriki.net/wd/2007/07/16/26/</link>
		<comments>http://www.ginriki.net/wd/2007/07/16/26/#comments</comments>
		<pubDate>Sun, 15 Jul 2007 20:24:04 +0000</pubDate>
		<dc:creator>ginriki</dc:creator>
				<category><![CDATA[Ocaml]]></category>
		<category><![CDATA[debugger]]></category>

		<guid isPermaLink="false">http://www.gikogeek.net/wd/?p=26</guid>
		<description><![CDATA[
ML言語の一種であるOcamlに付属している、ocamldebugというデバッガについて調べたのでメモ。
かなり間違っている可能性があるので、注意。

 gdbライクなCUI

 break,info,helpコマンド [...]]]></description>
			<content:encoded><![CDATA[<div class="section">
<p>ML言語の一種であるOcamlに付属している、ocamldebugというデバッガについて調べたのでメモ。</p>
<p>かなり間違っている可能性があるので、注意。</p>
<ul>
<li> gdbライクなCUI
<ul>
<li> break,info,helpコマンド等、gdbを知っている人なら何となく使えるようにコマンド名がつけられてます</li>
<li> でも、printコマンドで関数呼び出しや代入が行えないなど<span class="footnote"><a href="/gikogeek/#f1" name="fn1" title="http://caml.inria.fr/pub/docs/manual-ocaml.bak/manual030.htmlの16.7項に書かれているBNF記法を見る限りできないよなあ・・・たぶん">*1</a></span>、gdbと違う点もあるので注意</li>
</ul>
</li>
<li> breakで停止できるのは、eventと呼ばれる箇所でのみ
<ul>
<li> <a href="http://caml.inria.fr/pub/docs/manual-ocaml.bak/manual030.html">Ocamlマニュアル</a>のEventsの項目にeventとなる箇所が書いてある</li>
</ul>
</li>
<li> debuggerとdebugeeは別プロセス
<ul>
<li> Unixだと、BSDソケットを使ってプロセス間通信することでdebugee上に存在する変数の値の参照等を行っている。ここらへんは、Javaデバッガの実装に近い</li>
</ul>
</li>
<li> 日本語の処理関係は、まだ弱いらしい
<ul>
<li> <a href="http://www.h2.dion.ne.jp/~pana/camldebug/camldebug.html" target="_blank">http://www.h2.dion.ne.jp/~pana/camldebug/camldebug.html</a>のような件</li>
</ul>
</li>
<li> mlコード内のprint_int, print_string等の標準出力への出力用関数の処理は、ocamldebugでステップ実行している間は実際には行われない
<ul>
<li> debugeeの実行が終了した段階で出力される</li>
<li> 出力をバッファしてるのかな？</li>
<li> おそらく、ファイル出力やTCP等によるデータ送信も同様</li>
<li> タイムトラベル機能（後述）のためにこのような実装になってる？</li>
<li> ファイルからの入力がどうなるかはまだ調べてない</li>
</ul>
</li>
<li> 変数の値等の状態も含めて実行を前の地点まで巻き戻して、そこから再実行する機能がある（タイムトラベル機能）
<ul>
<li> ocamldebugが適切なタイミングでcheckpointを取り、それを利用して実行の巻き戻しを行う</li>
<li> 巻き戻した地点がcheckpointを取った地点と一致しない場合は、最寄のcheckpointからその地点まで再実行して停止？</li>
<li> checkpointを取るための実装にはforkを使ってる<span class="footnote"><a href="/gikogeek/#f2" name="fn2" title="http://caml.inria.fr/pub/docs/manual-ocaml/manual030.htmlのTurning reverse execution on and offの項目に書いてある">*2</a></span></li>
<li> プロセスIDが巻き戻す前と後で違うなど、完全に状態を巻き戻すことはできないため、いやらしいプログラムの実行を巻き戻すと挙動がおかしくなった</li>
</ul>
</li>
</ul>
<p></p>
<p>ocamldebugはOcamlで実装されているので、私には読めん・・・</p>
</div>
<div class="footnote">
<p class="footnote"><a href="/gikogeek/#fn1" name="f1">*1</a>：<a href="http://caml.inria.fr/pub/docs/manual-ocaml.bak/manual030.html" target="_blank">http://caml.inria.fr/pub/docs/manual-ocaml.bak/manual030.html</a>の16.7項に書かれているBNF記法を見る限りできないよなあ・・・たぶん</p>
<p class="footnote"><a href="/gikogeek/#fn2" name="f2">*2</a>：<a href="http://caml.inria.fr/pub/docs/manual-ocaml/manual030.html" target="_blank">http://caml.inria.fr/pub/docs/manual-ocaml/manual030.html</a>のTurning reverse execution on and offの項目に書いてある</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.ginriki.net/wd/2007/07/16/26/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

