我刚收到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求解器函数中,我无法访问它。我仔细检查了我多次传递给这个函数的所有参数,它们似乎没问题(至少对应于我之前手册和示例中的那些)。
答案 0 :(得分:3)
???
几乎肯定意味着Valgrind无法在相关地址附近的任何地方找到符号。我怀疑你在没有代码的情况下执行代码。这可能是覆盖堆栈上的返回地址的结果,例如,可能是缓冲区溢出的结果(但是其他指针错误可以触发它)Valgrind非常擅长动态分配内存的问题,但它有更多使用局部变量的困难工作,因为它并不总是能够确定堆栈数组的结束位置。
答案 1 :(得分:1)
如果您在剥离的二进制文件/库上运行Valgrind并且在本地符号(例如静态函数)中发现错误,则会得到此结果的一种情况。
使用仍包含有关所有本地符号的信息的二进制文件/库的未提取版本将在Valgrind输出中提供源文件和行号。