################################
# malloc()ダンプユーティリティ #
################################

概要
====

malloc()関数で割り当てたメモリブロックを一覧表示するプログラムです。

P/ECE開発環境に入っている「isd.exe」の'h'コマンドを使えば、
P/ECE APIのpceHeapAlloc()で割り当てたメモリブロックを一覧表示できます。
しかし、malloc()で割り当てたメモリブロックを表示することはできません。

malloc()ダンプユーティリティは、malloc()で割り当てたメモリブロックを一覧表示します。
逆に、pceHeapAlloc()で割り当てたメモリブロックを表示することはできません。
isd.exeの'h'コマンドと、互いに補完しあう形となります。

特徴
====

pceHeapAlloc()のヒープ領域とは異なり、malloc()のヒープ領域はアプリケーションごとに
位置が変わります。
ヒープ管理情報の位置も変化しますので、本来はSYMファイルなどからヒープ情報の位置を
読み込む必要があります。
しかし、SYMファイルを指定するのが面倒だったので、malloc()ダンプユーティリティでは、
SRAM全体から「ヒープ管理情報らしく見える」データを探し出し、
そのデータをもとにメモリブロックの一覧表示を行います。
よって、SYMファイルは不要です。

使い方
======

P/ECEをPCに接続し、検査したいP/ECEアプリケーションを起動してください。
アプリケーションが起動したら、PCのコマンドプロンプトで、

	dmalloc

とタイプしてください。メモリブロック情報が一覧表示されます。
表示される情報の意味は、次の例を参照してください。

	============= ヒープ情報 =============
	0010ecf8: ansi_ucStartAlloc = 001090b4 ... ヒープ領域先頭アドレス
	0010ecfc: ansi_ucEndAlloc   = 0010b0b4 ... ヒープ領域終端アドレス
	0010ed00: ansi_ucNxtAlcP    = 001090ec ... 空き領域先頭アドレス
	0010ed04: ansi_ucTblPtr     = 0010b09c ... 管理テーブル先頭アドレス
	0010ed08: ansi_ulRow        = 00000002 ... 管理テーブルの要素数
	============ ブロック情報 ============
	Index     Address   Size      Status
	00000000  001090b4  0000001c  FREE     ... ひとつめのブロック情報
	00000001  001090d0  0000001c  USE      ... ふたつめのブロック情報

	ブロック情報は、割り当て／開放されたブロックの数だけ表示されます。
	ブロック情報の意味は、次のとおりです。

	Index   ... 見やすいようにブロックに連番を振っただけで、特に意味はありません。
	Address ... ブロックの先頭アドレスです。
	Size    ... ブロックのバイト数です。
	Status  ... 空きブロック（ここに割り当て可能）なら「FREE」、
	            使用中ブロック（ここに割り当て付加）なら「USE」と表示します。

ヒープ管理情報が見つからなかったときは、次のように表示します：

	ヒープ情報が見つかりません。

アプリケーションがmalloc()を使っていない場合は、ヒープ管理情報が見つかりません。
ただし、前のアプリケーションのヒープ管理情報がSRAM上に消えずに残っていた場合、
それをヒープ管理情報と見なしてしまい、メモリブロックを一覧表示してしまうことがあります。

注意
====

前述のとおり、malloc()ダンプユーティリティは、ヒープ管理情報の位置を推測します。
たいていは、正しく推測できるのですが、希に、ヒープ管理情報でないデータを
ヒープ管理情報として認識してしまいます。
その場合、警告表示と共に、推測されたすべてのヒープ管理情報に基づくメモリブロックを
一覧表示します。
出力は、次の例のようになります。

	### 警告！複数のヒープ情報が見つかりました。

	### 候補1

	============= ヒープ情報 =============
	0010ecf8: ansi_ucStartAlloc = 001090b4
	0010ecfc: ansi_ucEndAlloc   = 0010b0b4
	0010ed00: ansi_ucNxtAlcP    = 001090ec
	0010ed04: ansi_ucTblPtr     = 0010b09c
	0010ed08: ansi_ulRow        = 00000002
	============ ブロック情報 ============
	Index     Address   Size      Status
	00000000  001090b4  0000001c  USE
	00000001  001090d0  0000001c  USE

	### 候補2

	============= ヒープ情報 =============
	00122444: ansi_ucStartAlloc = 00122464
	00122448: ansi_ucEndAlloc   = 0013eff0
	0012244c: ansi_ucNxtAlcP    = 00122464
	00122450: ansi_ucTblPtr     = 0013efe8
	00122454: ansi_ulRow        = 00000000
	============ ブロック情報 ============
	Index     Address   Size      Status

前のアプリケーションのヒープ管理情報がSRAMの後ろの方にあり、消えずに残っていたりすると、
SRAMの前方にある今のアプリケーションのヒープ管理情報とだぶって検出されてしまうことがあります。
たいていの場合、最初に見つかった方が正しいヒープ管理情報です。

P/ECE背面のリセットボタンを押すと、SRAMの内容が完全に消去されますので、
前のアプリケーションのヒープ管理情報を間違って検出してしまわないようにするためには、
目的のアプリケーションを実行する前に、いったんリセットボタンを押すのがいいと思います。

-----
Tue Jul  3 21:11:00 JST 2002 追記
バージョンアップにより、上記の問題はほぼ解消されました。
前のアプリケーションの消え残りを間違って検出してしまうことは、まず、なくなりました。
もう、リセットボタンを押す必要はありません。
-----

なお、
	「ヒープ管理情報でないデータをヒープ管理情報と見なしてしまう」
ことはありますが、
	「正しいヒープ管理情報をヒープ管理情報でないと見なしてしまう」
ことはありません。

オプション・引数（2002/07/07追記）
================

	dmalloc [options] [devno]

引数：
	devno	P/ECEデバイス番号
		省略時は、#0（一台目のP/ECE）に接続します。

オプション：
	-h	ヒープ情報を出力します。
	-b	ブロック情報を出力します。
	-t	統計情報を出力します。
	-h,-b,-tいずれも指定しなければ、全情報を出力します。

---------------------------------
Wed Jun 16 06:52:00 JST 2004 追記
---------------------------------

・P/ECE API pceHeapAlooc()用ヒープ情報表示を追加しました。
　これまでは、EPSONライブラリmalloc()用ヒープ情報だけを表示していました。

---------------------------------
Wed Dec 29 22:57:00 JST 2004 追記
---------------------------------

・スタック情報表示機能を追加しました。
　2004/12/29以降のCLiPライブラリを利用しているアプリケーションの、スタック情報を表示可能です。

=============================
Wed Dec 29 22:57:00 JST 2004
Naoyuki Sawa
nsawa@north.hokkai.net
=============================
