リーク検査機能をオンにすると、プログラムの終了時に自動リークレポートが生成されます。プログラムが kill コマンドによって強制終了されていなければ、可能性のあるリークがすべて報告されます。デフォルトでは、dbxenv 変数 rtc_mel_at_exit で指定してある簡易リークレポートが生成されます。
レポートは、リークのサイズによってソートされます。実際のメモリーリークが最初に報告され、次に可能性のあるリークが報告されます。詳細レポートには、スタックトレース情報の詳細が示されます。行番号とソースファイルが使用可能であれば、これらも必ず含まれます。
次のメモリーリークエラー情報が、2 種類の報告のどちらにも含まれます。
リークしたブロックが割り当てられた場所 |
リークしたブロックのアドレス |
リークしたブロックのサイズ |
割り当て時の呼び出しスタック。check -frames によって制約される |
簡易レポートはエラー情報をテーブルに出しますが、詳細レポートでは、各エラーについて個別のエラーメッセージが示されます。どちらもソースコード内のエラーの位置にハイパーテキストでリンクされます。
実際のリークの報告 (実際のリーク: 1 合計サイズ: 1 バイト) 合計 ブロック リーク 割り当て呼出しスタック サイズ 数 ブロック アドレス ====== ======== ========= ===================================== 1 1 0x20f18 mel < leaks < main 起こり得るリークの報告 (起こり得るリーク: 1 合計サイズ 4 バイト) 合計 ブロック リーク 割り当て呼出しスタック サイズ 数 ブロック アドレス ====== ======== ========= ===================================== 4 1 0x20ef8 aib < leaks < main
実際のリークの報告 (実際のリーク: 1 合計サイズ: 1 バイト) メモリーリーク (mel): 大きさ 1 バイト のリークのあるブロックをアドレス 0x20f18 に発見 割り当て時のスタックの状態: [1] mel() 行番号 19 "leaks.c" [2] leaks() 行番号 6 "leaks.c" [3] main() 行番号 7 "main.c" 起こり得るリークの報告 (起こり得るリーク: 1 合計サイズ 4 バイト) メモリーリークの可能性 -- ブロック中のアドレス (aib): 大きさ 4 バイト のリークのあるブロックをアドレス 0x20ef8 に発見 割り当て時のスタックの状態: [1] aib() 行番号 11 "leaks.c" [2] leaks() 行番号 5 "leaks.c" [3] main() 行番号 7 "main.c"
showleaks コマンドを使用すると、いつでもリークレポートを要求することができます。このコマンドは、前回の showleaks コマンド以降の新しいメモリーリークを報告するものです。
リークレポートの数が多くなるのを避けるため、RTC は同じ場所で割り当てられたリークを自動的に 1 つにまとめて報告します。1 つにまとめるか、それぞれ各リークごとに報告するかは、一致フレーム数引数によって決まります。この引数は、check -leaks コマンドを実行する際は -match m オプション、showleaks コマンドを実行する際は -m オプションで指定します。呼び出しスタックが 2 つ以上のリークを割り当てる際に m 個のフレームと一致した場合は、リークは 1 つにまとめて報告されます。
ブロック 1 |
ブロック 2 |
ブロック 3 |
[1] malloc |
[1] malloc |
[1] malloc |
[2] d() at 0x20000 |
[2] d() at 0x20000 |
[2] d() at 0x20000 |
[3] c() at 0x30000 |
[3] c() at 0x30000 |
[3] c() at 0x31000 |
[4] b() at 0x40000 |
[4] b() at 0x41000 |
[4] b() at 0x40000 |
[5] a() at 0x50000 |
[5] a() at 0x50000 |
[5] a() at 0x50000 |
これらのブロックがすべてメモリーリークを起こす場合、m の値によって、これらのリークを別々に報告するか、1 つのリークが繰り返されたものとして報告するかが決まります。m が 2 のとき、ブロック 1 とブロック 2 のリークは 1 つのリークが繰り返されたものとして報告されます。これは、malloc() の上にある 2 つのフレームが共通しているためです。ブロック 3 のリークは、c() のトレースがほかのブロックと一致しないので別々に報告されます。m が 2 より大きい場合、RTC はすべてのリークを別々に報告します (malloc はリークレポートでは表示されません)。
一般に、m の値が小さければリークのレポートもまとめられ、m の値が大きければまとめられたリークレポートが減り、別々のリークレポートが生成されます。