【问题标题】:Segmentation fault in valgrind, but not in actual runvalgrind中的分段错误,但在实际运行中没有
【发布时间】: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-&gt;pArray 很可能为 null。 (您可以为此添加一个新断言,或扩展现有断言。)当您调用未定义的行为时,软件没有义务崩溃;它看起来很有效,而且通常会在你的老板向你公司最重要的客户炫耀你的工作之前这样做。至少你早早就发现了问题。
  • 除了(非常恰当的)“未定义的行为可以做任何它想做的事情,包括不崩溃”的推理之外,请注意,在 valgrind 下运行的一个副作用是它极大地改变了你的程序(主要是让它运行得更慢)。因此,如果您有一个错误,其症状仅在您的程序运行速度比正常慢时才明显,valgrind 可能会暴露该错误。这可能发生,例如如果您在 valgrind 下运行有问题的客户端,并且它正在与仍在以正常速度运行的服务器通信。

标签: c++ memory valgrind


【解决方案1】:

如 cmets 中所述,未定义的行为不一定会导致崩溃。它可以很好地运行。但是,这里的情况似乎并非如此。

我们可以从消息中看到

Process terminating with default action of signal 11 (SIGSEGV)
==3290==  Access not within mapped region at address 0x0

该程序已尝试访问地址 0x0。这通常意味着我们已经取消引用了一个 NULL 指针。

查看您的代码:

static inline void * Vec_PtrEntry( Vec_Ptr_t * p, int i )
{
    assert( i >= 0 && i < p->nSize );
    return p->pArray[i];
}

我们可以看到您试图通过断言i&gt;=0i&lt;p-&gt;nSize 来防止无效参数。但是,没有检查 p 本身是否有效。

您可以assert(p) 确保它不为NULL。您应该在现有断言之前执行此操作。

至于为什么这只在 valgrind 下运行时会发生这种情况,一个重要的考虑因素是程序在 valgrind 下运行速度要慢得多,因此您可能已经暴露了一个仅在重负载下发生的问题,或者至少与规范。

您如何解决这个问题并继续进行内存分析?你需要修复这个错误。

  1. 使用调试器。 gdb 与 valgrind 完美集成
  2. 使用断言来验证 p 是否为非空。

其中任何一个都应该允许您查看回溯,并找出 p 为 NULL 的原因。

【讨论】:

  • 同意可能的原因(我自己也以同样的方式回答;更容易支持你的)。 OP 应该查看生成并使用 p 的操作流程。在普通代码中,这两个操作将非常接近,例如循环将没有时间执行或只执行一次;我怀疑有一些代码由外部事件(套接字)驱动或运行线程,并且 p 陷入竞争状态。我相信这实际上是 Valgrind 的一个优势,因为它可以捕捉到在很长一段时间内(或直到大秀日,以先到者为准)都会被忽视的错误。
猜你喜欢
  • 2018-10-16
  • 2017-09-04
  • 2015-08-22
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
  • 2015-06-19
  • 2021-08-03
  • 1970-01-01
相关资源
最近更新 更多