Oracle Solaris Studio 12.2: dbx コマンドによるデバッグ

リークの検査

メモリーリーク検査がオンの場合、メモリーリークの走査は、テスト中のプログラムが終了する直前に自動的に実行されます。検出されたリークはすべて報告されます。プログラムを、kill コマンドによって強制的に終了しないでください。次に、典型的なメモリーリークエラーによるメッセージを示します。


Memory leak (mel):
Found leaked block of size 6 at address 0x21718
At time of allocation, the call stack was:
    [1] foo() at line 63 in test.c
    [2] main() at line 47 in test.c

UNIX プログラムには通常 main 手続き (FORTRAN 77 では MAIN) が存在します。これは、プログラムに対するトップレベルのユーザー関数です。プログラムは exit(3) が呼び出されるか、main から返った時点で終了します。いずれの場合でも、main のすべての局所変数はプログラムが停止するまでスコープから出ず、それらを指す特定のヒープブロックはすべてメモリーリークとして報告されます。

main 内の局所変数に割り当てられているヒープブロックはプログラムでは解放しないのが一般的です。なぜなら、プログラムは終了しようとしており、exit() を呼び出すことなく main から復帰するためです。これらのブロックがメモリーリークとして報告されないようにするには、main 内の最後の実行可能なソース行にブレークポイントを設定することによって、main から復帰する直前でプログラムを停止します。プログラムがそこで停止したとき、RTC の showleaks コマンドを実行すれば、main() とそこで呼び出されるすべての手続きで参照されなくなったヒープブロックのすべてが表示されます。

詳細については、showleaks コマンド」を参照してください。