Valgrind输出地址和问号?

时间:2013-03-08 14:24:03

标签: c++ memory-management memory-leaks valgrind ode

我刚收到valgrind的输出,我不太明白:

==20290== Invalid read of size 1
==20290==    at 0x8C1D678: ???
==20290==    by 0x5D74C47: ???
==20290==  Address 0xee818c7d is not stack'd, malloc'd or (recently) free'd
==20290== 
==20290== 
==20290== Process terminating with default action of signal 11 (SIGSEGV)
==20290==  Access not within mapped region at address 0xEE818C7D
==20290==    at 0x8C1D678: ???
==20290==    by 0x5D74C47: ???
==20290==  If you believe this happened as a result of a stack
==20290==  overflow in your program's main thread (unlikely but
==20290==  possible), you can try to increase the size of the
==20290==  main thread stack using the --main-stacksize= flag.
==20290==  The main thread stack size used in this run was 8388608.
==20290== 

特别是,我对这些问号感到困惑。通常,您在这个地方得到的是valgrind检测到的错误的位置。我之前使用过valgrind,所有输出都是manual中描述的。我使用过这个valgrind命令:

valgrind --tool=memcheck --leak-check=full --leak-resolution=high --num-callers=20 --track-origins=yes

程序本身会出现分段错误。虽然valgrind这次没有告诉我任何内存泄漏的位置,但是从调试开始我确定了发生分段故障的地方。不幸的是,它位于英特尔ODE求解器库(dodesol)的ODE求解器函数中,我无法访问它。我仔细检查了我多次传递给这个函数的所有参数,它们似乎没问题(至少对应于我之前手册和示例中的那些)。

2 个答案:

答案 0 :(得分:3)

???几乎肯定意味着Valgrind无法在相关地址附近的任何地方找到符号。我怀疑你在没有代码的情况下执行代码。这可能是覆盖堆栈上的返回地址的结果,例如,可能是缓冲区溢出的结果(但是其他指针错误可以触发它)Valgrind非常擅长动态分配内存的问题,但它有更多使用局部变量的困难工作,因为它并不总是能够确定堆栈数组的结束位置。

答案 1 :(得分:1)

如果您在剥离的二进制文件/库上运行Valgrind并且在本地符号(例如静态函数)中发现错误,则会得到此结果的一种情况。

使用仍包含有关所有本地符号的信息的二进制文件/库的未提取版本将在Valgrind输出中提供源文件和行号。