2012-05-04 9 views
2

私はsegfaultを与えているC/C++コードを持っています。これは、RH Linux Enterpriseサーバー上でgcc/g ++を使用してコンパイルされます。私はValgrindのの出力メッセージの一つとしてこれを取得Valgrindの出力に基づいてさらにデバッグする方法

valgrind --tool=memcheck --leak-check=full --show-reachable=yes 

:私は実行可能でValgrindはメモリチェッカーを使用

==7053== Invalid read of size 1 
==7053== at 0xDBC96C: func1 (file1:4742) 
==7053== by 0xDB8769: func2 (file1.c:3478) 
==7053== by 0xDB167E: func3 (file1.c:2032) 
==7053== by 0xDB0378: func4 (file1.c:1542) 
==7053== by 0xDB97D8: func5 (file1.c:3697) 
==7053== by 0xDB17A7: func6 (file1.c:2120) 
==7053== by 0xDBD55E: func7 (file2.c:271) 

==7053== Address 0x1bcaf2f0 is not stack'd, malloc'd or (recently) free'd 

私は私のコードは、無効なメモリ位置にアクセスしたことを意味することを読んでに許可されていません。

私の質問:

  1. 私はそのバッファメモリへのアクセスを見つけるにはどうすればよいが無効になっている、との機能のこれは上記のことを行っています。

  2. どのように使用することができます0x1bcaf2f0、valgrindは無効ですと言っています。そのアドレスでシンボル(基本的にはバッファ名)を見つけるにはどうすればよいですか?メモリマップファイル、他の方法。

  3. メモリ(ヒープ/スタックの破損)エラーを検出するためにValgrindを使用するためのその他の一般的なポインタ、valgrindオプション、またはその他のツールはありますか?

答えて

3

広告1:この例では、file1:4742(1)行のfunc1になります。以下の関数はスタックトレースです。その行を解析すると、無効なメモリアクセスが発生します。

広告2:あまりにも複雑で明示的でないコールが警告の原因となっている場合は、複数の簡単な行に分割してみてください。

ad 3:memcheckは、ヒープメモリでエラーを検出するための典型的なvalgrindツールです。しかし、スタックの破損には役立ちません。

+0

ありがとうございます。上記のvalgrindの出力に表示されている '0x1bcaf2f0'というメモリ位置の変数をどのようにトレースするのですか? – goldenmean

+0

特に示されたアドレスが動的に割り当てられたバッファから来た場合は? – goldenmean

+0

スタックの破損に役立つものは何ですか? – xaxxon

関連する問題