プログラミングインタフェース

動的メモリーデバッグ

Sun WorkShop ツールパッケージを使用すると、動的メモリーの使用中に発生するエラーを発見して削除することができます。Sun WorkShop の Run Time Checking (RTC) 機能は、動的メモリーの使用中に発生するエラーを発見します。

-g オプションを付けてプログラムをコンパイルしなくても、RTC はすべてのエラーを発見できます。しかし、特に初期化されていないメモリーから読み取る場合、エラーの正確性を保証するために、(-g で入手できる) シンボリック情報が必要になることもあります。したがって、シンボリック情報が入手できないと、ある種のエラーは抑制されます。このようなエラーには、a.outrui や共有ライブラリの rui + aib + air があります。この動作を変更するには、suppressunsuppress を使用します。

check -access

-access オプションは、アクセス権のチェックをオンにします。RTC は次のようなエラーを報告します。

baf

不正な解放

duf

重複する解放

maf

整列されていない解放

mar

整列されていない読み取り

maw

整列されていない書き込み

oom

メモリー不足

rua

割り当てられていないメモリーからの読み取り

rui

初期化されていないメモリーからの読み取り

rwo

読み取り専用メモリーへの書き込み

wua

割り当てられていないメモリーへの書き込み

デフォルトの動作は、アクセス権エラーを発見するたびにプロセスを停止します。この動作を変更するには、rtc_auto_continue dbxenv 変数を使用します。on に設定した場合、RTC はアクセス権エラーをファイルに記録します。このファイル名は rtc_error_log_file_name dbxenv 変数の値で決定されます。デフォルトでは、一意なアクセス権エラーごとにエラーが発生した最初の時刻だけが報告されますが、この動作は、rtc_auto_suppress dbxenv 変数を使用して変更できます。この変数のデフォルト設定は on です。

check -leaks [-frames n] [-match m]

-leaks オプションは、リークのチェックをオンにします。RTC は次のようなエラーを報告します。

aib

メモリーリークの可能性 – 唯一のポインタがブロックの真ん中を指しています。

air

メモリーリークの可能性 – ブロックへのポインタがレジスタだけに存在します。

mel

メモリーリーク – ブロックへのポインタが存在しません。

リークのチェックをオンにした場合、プログラムが終了したとき、リークレポートが自動的に報告されます。このとき、潜在的なリークを含むすべてのリークが報告されます。デフォルトでは、簡易レポートが生成されます。このデフォルトは dbxenv rtc_mel_at_exit を使用すると変更できます。リークレポートはいつでも要求できます。

-frames n 変数を使用した場合、リークが報告されるとき、n 個までのスタックフレームが個別に表示されます。-match m 変数を使用した場合、リークは結合されて表示されます。複数のリークが発生した割り当て時に、呼び出しスタックが m 個のフレームに一致した場合、これらのリークは結合されて、単一のリークレポートとして報告されます。n のデフォルト値は 8 または m の大きい方ですが、n の最大値は 16 です。m のデフォルト値は 2 です。

check -memuse [-frames n] [-match m]

-memuse オプションはメモリー (ブロック) の使用状況のチェック (memuse) をオンにします。check -memuse を使用すると、check -leaks も自動的に使用されます。つまり、プログラムが終了したとき、リークレポートに加えて、(メモリー) ブロック使用状況レポート (biu) が報告されます。デフォルトでは、簡易 (メモリー) ブロック使用状況レポートが生成されます。このデフォルトは、dbxenv rtc_biu_at_exit によって制御されます。プログラムの実行中はいつでも、プログラム内のメモリーがどこに割り当てられているかを参照できます。

次の節では、-frames n-match m 変数の機能について説明します。

check -all [-frames n] [-match m]

check -access; check -memuse [-frames n] [-match m] と同じです。rtc_biu_at_exit dbxenv 変数の値は check -all では変更されません。そのため、デフォルトでは、プログラムが終了したとき、メモリー (ブロック) 使用状況レポートは作成されません。

check [funcs] [files] [loadobjects]

check -all; suppress all; unsuppress all in funcs files loadobjects と同じです。このオプションを使用すると、気になる場所に RTC を集中させることができます。