2

私はセグメンテーション違反を与えているC/C++コードを持っています。RHLinuxEnterpriseサーバーでgcc/g++を使用してコンパイルされます。実行可能ファイルでValgrindメモリチェッカーを使用しました。

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

これをValgrindの出力メッセージの1つとして受け取ります。

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

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

4

2 に答える 2

3

広告1:あなたの例では、それはfile1:4742(1)行のfunc1になります。次の関数はスタックトレースです。その行を分析すると、無効なメモリアクセスにつながるはずです。

広告2:複雑すぎて、どの正確な呼び出しが警告を引き起こしているのかわからない場合は、複数の単純な行に分割してみてください。

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

于 2012-05-05T18:21:46.993 に答える
0

Valgrind 3.7.0を使用している場合は、組み込みのgdbserverを使用して、Valgrindで実行されているアプリケーションをgdbでデバッグできます。

http://www.valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.gdbserverを参照してください

于 2012-06-22T21:32:58.147 に答える