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

印刷ビューの終了

更新: 2015 年 1 月
 
 

リークの検査

メモリーリーク検査が有効になっている場合、メモリーリークのためのスキャンは、テスト対象のプログラムが終了する直前に自動的に実行されます。検出されたリークはすべて報告されます。このプログラムを、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 手続き (f77 では MAIN と呼ばれます) が含まれています。プログラムは exit(3) が呼び出されるか、main から返った時点で終了します。後者の場合は、戻ったあとに main にローカルなすべての変数がスコープから外れるため、大域変数がこれらの同じブロックを指していないかぎり、それらの変数が指していたヒープブロックはすべてリークとして報告されます。

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

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