Valgrind中的分割故障,但实际运行中没有
Segmentation fault in valgrind, but not in actual run
我的代码在Valgrind内部运行时会产生分割故障,但是当运行正常运行时,它不会。怎么可能?
罪魁祸首,如Valgrind:
指出的那样static inline void * Vec_PtrEntry( Vec_Ptr_t * p, int i )
{
assert( i >= 0 && i < p->nSize );
return p->pArray[i];
}
和Valgrind的消息:
Process terminating with default action of signal 11 (SIGSEGV)
==3290== Access not within mapped region at address 0x0
如果代码通常运行完美,为什么会发生这种情况?我该如何解决?我需要对代码进行一些记忆分析。
如注释中所述,未定义的行为不必涉及崩溃。它可以很好地发挥作用。但是,这里似乎并非如此。
我们可以从消息中看到
Process terminating with default action of signal 11 (SIGSEGV)
==3290== Access not within mapped region at address 0x0
该程序已尝试访问地址0x0。这通常意味着我们已经删除了一个无数分量。
查看您的代码:
static inline void * Vec_PtrEntry( Vec_Ptr_t * p, int i )
{
assert( i >= 0 && i < p->nSize );
return p->pArray[i];
}
通过断言i>=0
和i<p->nSize
,我们可以看到您试图防止无效参数。但是,没有检查p
本身有效。
您可以assert(p)
以确保其不为空。您应该在现有断言之前执行此操作。
关于为什么仅在Valgrind下运行时才发生这种情况,一个重要的考虑是,程序在Valgrind下运行速度要慢得多,因此您可能已经暴露了一个仅在重负载下发生的问题,或者至少与与该行为完全不同的动态行为规范。
您如何解决此问题并通过内存分析前进?您需要修复错误。
- 使用调试器。GDB与Valgrind 很好地集成
- 使用断言来验证p是非null。
其中任何一个都应该让您看到后跟踪,并弄清楚为什么p为null。
相关文章:
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 代码在main()中运行,但在函数中出现错误
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 如何在C++中从字符串中分割字符
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何在运行中期切换GTK CSS style_context
- C++映射分割错误(核心转储)
- 如何在MS Visual Studio 2019中运行QT UI
- 如何通过cpp程序运行shell脚本
- IPC使用多个管道和分支进程来运行Python程序
- 删除指向指针的指针是运行时错误吗
- 我的代码在执行过程中运行良好.但是当我去提交它的显示分割错误时
- 为什么包括-FPIC来编译静态库会在运行时会导致分割故障
- Valgrind中的分割故障,但实际运行中没有
- GDB算术异常 - 无零分割 - 运行时错误
- 分割如何提高埃拉托斯尼筛的运行时间
- 在运行时使用未来的c++分割错误