レポートの読み方
出力を解釈します。
「レポートの読み方」はCoddyKit上の無料C Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。
レポートの構成
Valgrindのレポートは3つの部分で構成されます。
- すべての行に付くプロセスIDプレフィックス
- エラーが発生した時点で出力される1つ以上のエラーブロック
- 終了時に出力される最後のHEAP and LEAK SUMMARY
各部分の読み方を学ぶと、大量のテキストが正確な作業リストに変わります。
PIDプレフィックス
Valgrindの各行は==PID==で始まります。たとえば==12345==のようになります。
これはプロセスIDであり、プログラムの出力の一部ではありません。プログラムのprintf出力とValgrindのメッセージが同じ端末に表示されても、両者を区別できます。
==12345== Memcheck, a memory error detector
==12345== Command: ./prog
==12345==エラーブロックの例
実際のinvalid-writeブロックを見てみましょう。
==12345== Invalid write of size 4==12345== at 0x4005A1: main (prog.c:6)==12345== Address 0x520304c is 0 bytes after a block of size 20 alloc'd==12345== at 0x4838B40: malloc==12345== by 0x40058E: main (prog.c:5)
最初の行を読む
最初の行にはエラーの種類とサイズが示されます。「Invalid write of size 4」という内容です。
サイズ4は4バイトのアクセスを意味し、通常はintに相当します。この1行だけで、続きを読む前にどの種類のバグかを把握できます。
スタックトレースを読む
atの行は最も内側のフレームで、エラーが発生した場所です。各byの行は呼び出し元を示し、1つ上のレベルにあたります。
上から下へ、最も深いフレームから浅いフレームの順に読みます。自分のファイル名が最初に現れるフレームが、ほぼ必ずバグの箇所です。
==12345== at 0x4005A1: do_work (work.c:12)
==12345== by 0x4006F0: main (main.c:8)アドレスの注記を読む
Address ...の行には、既知のブロックを基準にしたアクセス位置が示されます。
0 bytes after a block of size 20 alloc'd— ブロックの末尾を直後に越えたオーバーフロー4 bytes inside a block of size 4 free'd— 解放後使用on thread 1's stack— スタックへのアクセス
さらに、そのブロックが割り当てられた場所や解放された場所も表示されます。
HEAP SUMMARY
終了時には、割り当てに関する集計が表示されます。
==12345== HEAP SUMMARY:==12345== in use at exit: 20 bytes in 1 blocks==12345== total heap usage: 3 allocs, 2 frees, 1,044 bytes allocated
「in use at exit」が0より大きい場合、解放されていないものがあります。
LEAK SUMMARY
ヒープの概要の下では、リークが分類されます。
definitely lost: 20 bytes in 1 blocksindirectly lost: 0 bytes in 0 blockspossibly lost: 0 bytes in 0 blocksstill reachable: 0 bytes in 0 blocks
--leak-check=fullを追加すると、失われた各ブロックにトレースを付けられます。
ERROR SUMMARY
最後の行では、すべてのエラーが集計されます。
ERROR SUMMARY: 2 errors from 2 contexts
「context」とは、エラーが発生した一意な場所です。バグのある行がループ内で100万回実行されても、contextは1つです。目標は0 errors from 0 contextsです。
対処の順序
レポートには、手順に沿って対処します。
- まず不正なアクセスのエラーを修正します。データ破壊の原因になるためです
- 次に未初期化値のエラーを修正します
- その後、definitely lostとindirectly lostのリークを修正します
- 修正するたびに再実行します。1つの根本原因で複数のレポートが解消されることがよくあります
既知のノイズを抑制する
Cランタイムやグラフィックスドライバーなど、修正できないライブラリに由来するエラーもあります。抑制ファイルを生成すれば、自分のバグを隠さずにそれらのエラーを非表示にできます。
--gen-suppressions=allを指定すると、そのまま使える抑制エントリが表示されます。これを保存し、--suppressions=fileで再度渡します。
valgrind --gen-suppressions=all ./prog
valgrind --suppressions=mine.supp ./progクイックチェック
レポートの1行を読み解いてください。
まとめ
これで、Valgrindのレポートを最初から最後まで読めるようになりました。
==PID==はValgrindの各行に付くプレフィックスで、プログラムの出力と区別できます- 各エラーブロックには、種類、サイズ、スタックトレース、アドレスの注記が示されます
- HEAP/LEAKの概要では、割り当てと失われたメモリが集計されます
- ERROR SUMMARYでは一意なcontextの数が集計されます。ゼロを目指します
まずアクセスエラーに対処し、次にリークに対処します。進める途中で再実行してください。
よくある質問
「レポートの読み方」レッスンは無料ですか?
はい。「レポートの読み方」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。
「レポートの読み方」で何を学びますか?
出力を解釈します。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「レポートの読み方」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC Academyレッスンでコードを書いて実行できますか?
はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Valgrind を使う理由
- リークの検出
- 不正なアクセス
- レポートの読み方