質問

I have C/C++ code which is giving a segfault. It is compiled using gcc/g++ on a RH Linux Enterprise server. I used the Valgrind memory checker on the executable with:

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

I get this as one of Valgrind's output messages:

==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 

I read that to mean that my code has accessed an invalid memory location it is not allowed to.

My questions:

  1. How do I find out which buffer memory access has been invalid, and which of the functions above has done that.

  2. How can I use the address 0x1bcaf2f0, which valgrind is saying is invalid. How can I find the symbol (essentially, the buffer name) at that address? Memory map file, any other way.

  3. Any other general pointers, valgrind options or other tools for using Valgrind to detect memory (heap/stack corruption) errors?

役に立ちましたか?

解決

Ad 1: In your example, that'd be func1 in line file1:4742 (1). The following functions are the stack trace. Analyzing that line should lead you to the invalid memory access.

Ad 2: Try splitting it into multiple simpler lines in case it's too complex and not obvious which exact call is causing the warning.

Ad 3: memcheck is the quintessential valgrind tool for detecting errors with heap memory. It won't help for stack corruption though.

他のヒント

If you have Valgrind 3.7.0, you can use the embedded gdbserver to debug with gdb your application running under Valgrind.

See http://www.valgrind.org/docs/manual/manual-core-adv.html#manual-core-adv.gdbserver

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top