Valgrind输出带有地址和问号
Valgrind output with address and question marks?
我刚刚从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,所有的输出都和手册中描述的一样。我已经使用了这个valgrind命令:
valgrind --tool=memcheck --leak-check=full --leak-resolution=high --num-callers=20 --track-origins=yes
程序本身提示分段错误。虽然valgrind这次没有告诉我内存泄漏的任何位置,但通过调试,我已经确定了发生分段错误的位置。不幸的是,它位于Intel ODE求解器库(dodesol)中的一个ODE求解器函数中,我无法访问它。我已经仔细检查了我多次传递给这个函数的所有参数,它们似乎都没问题(至少与我之前的手册和示例相对应)。
???
几乎肯定意味着Valgrind无法在有问题的地址附近找到符号。我怀疑你在没有代码的地方执行代码。这可能是覆盖堆栈上的返回地址的结果,例如,可能是缓冲区溢出的结果(但其他指针错误可以触发它)Valgrind非常擅长处理动态分配内存的问题,但它在处理局部变量方面有一个更困难的工作,因为它并不总是可以确定堆栈上数组的结束位置。
你得到这个结果的一个场景是,如果你在一个剥离的二进制/库上运行Valgrind,它会在一个局部符号(例如一个静态函数)中发现一个错误。
使用未剥离的二进制/库版本,它仍然包含有关所有本地符号的信息,将在Valgrind输出中给出源文件和行号。
相关文章:
- 重载 ostream << 运算符,指针作为参数,导致输出上的内存地址
- GCC constexpr 允许添加,但不允许按位添加或带地址
- 输出显示多个带整数的字符串值
- 为什么cout输出内存地址不是字符串?
- C++可以输出一个结构的内存地址吗
- C++ - <<运算符重载,链表 - 地址而不是标准输出
- 输出常量字符 * 带分隔符
- 为什么 c_str() 在返回常量指针值时不输出地址
- C++:为什么最后一个输出不是地址以及如何获取值 9
- 获取“将返回值分配给新变量”的警告和输出是内存地址
- 无符号的 int 到 IP 地址字符串,不带 itoa/to_string/boost
- 使用嵌套功能时,Ostream输出会提供额外的地址
- 如何解释地址固定器输出
- C++数组输出地址
- C++重载运算符<<输出地址
- std::dec仍然将内存地址输出为十六进制
- 为什么 printf() 在指针中显示与 cout 不同的地址输出C++
- 输入和输出带二进制的多维向量
- 不带列号的二维数组提供地址
- 为什么我在使用带 pow 的地板时会得到意外的输出