【发布时间】:2015-05-13 02:55:22
【问题描述】:
我的代码在 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
如果代码正常运行,为什么会发生这种情况?我该如何解决?我需要对代码进行一些内存分析。
【问题讨论】:
-
如果不了解
p是如何创建的以及Vec_Ptr_t的定义,很难说会出现什么问题。 -
valgrind 有一个内置的 gdb 服务器。您当时是否尝试附加 gdb 并调查程序的状态?
-
认为自己很幸运;我看到它发生了相反的情况。
-
从表面上看,您正在某处访问空指针。
p为 null 或p->pArray很可能为 null。 (您可以为此添加一个新断言,或扩展现有断言。)当您调用未定义的行为时,软件没有义务崩溃;它看起来很有效,而且通常会在你的老板向你公司最重要的客户炫耀你的工作之前这样做。至少你早早就发现了问题。 -
除了(非常恰当的)“未定义的行为可以做任何它想做的事情,包括不崩溃”的推理之外,请注意,在 valgrind 下运行的一个副作用是它极大地改变了你的程序(主要是让它运行得更慢)。因此,如果您有一个错误,其症状仅在您的程序运行速度比正常慢时才明显,valgrind 可能会暴露该错误。这可能发生,例如如果您在 valgrind 下运行有问题的客户端,并且它正在与仍在以正常速度运行的服务器通信。