メモリーエラー探索ツール (discover) は、プログラム内のメモリーアクセスエラーを検出するための高度な開発ツールです。–g を指定してバイナリをコンパイルすると、discover はエラーおよび警告をレポートする際にソースコードおよび行番号情報を表示できるようになります。
discover ユーティリティーは簡単に使用できます。–g を指定してバイナリをコンパイルしてから、そのバイナリに対して discover コマンドを実行して計測機構を組み込みます。その後、計測機構の組み込まれたバイナリを実行して、discover レポートを生成します。discover レポートは、HTML 形式、テキスト形式、またはその両方で要求できます。レポートにはメモリーエラー、警告、およびメモリーリークが表示され、各エラーまたは警告についてソースコードとスタックトレースを表示することもできます。
discover(1) のマニュアルページにある次の例は、メモリーアクセスエラーを検出するための discover レポートを生成するために、実行可能ファイルを準備し、計測機構を組み込み、実行する方法を示しています。discover のコマンド行の –w オプションはレポートをテキストとして書き出すことを示し、–o オプションは出力を画面に表示することを示します。
% cc -g -O2 test.c -o test.prep % discover -w - -o test.disc test.prep % ./test.disc ERROR (UMR): accessing uninitialized data from address 0x5000c (4 bytes) at: foo() + 0xdc <ui.c:6> 3: int *t; 4: foo() { 5: t = malloc(5*sizeof(int)); 6:=> printf("%d0, t[1]); 7: } 8: 9: main() main() + 0x1c _start() + 0x108 block at 0x50008 (20 bytes long) was allocated at: malloc() + 0x260 foo() + 0x24 <ui.c:5> 2: 3: int *t; 4: foo() { 5:=> t = malloc(5*sizeof(int)); 6: printf("%d0, t[1]); 7: } 8: main() + 0x1c _start() + 0x108 ***************** Discover Memory Report ***************** 1 block at 1 location left allocated on heap with a total size of 20 bytes 1 block with total size of 20 bytes malloc() + 0x260 foo() + 0x24 <ui.c:5> 2: 3: int *t; 4: foo() { 5:=> t = malloc(5*sizeof(int)); 6: printf("%d0, t[1]); 7: } 8: main() + 0x1c _start() + 0x108
詳細は、discover(1) のマニュアルページとOracle Solaris Studio 12.4: Discover および Uncover ユーザーズガイド を参照してください。