free()在solaris 10的稀疏区域上随机返回SIGSEGV。为什么?

时间:2014-06-26 09:23:47

标签: c free solaris-10

我正在开发一个开源工具" zabbix"它在Solaris 10的RHEL / Global Zone上工作得非常好。但是当我尝试在Solaris 10的稀疏区域上运行此工具时,问题似乎令人困惑。在稀疏区域,该工具有时会工作,有时它会与SIGSEGV信号崩溃。在释放由变量分配的内存时,会引发此信号。

请参阅下面提出此信号的确切代码:

void    free_request(AGENT_REQUEST *request)
{
    int i;

    zbx_free(request->key);

    for (i = 0; i < request->nparam; i++)
        zbx_free(request->params[i]);
    zbx_free(request->params);

    request->nparam = 0;
}

请注意,这部分代码在Linux或任何Solaris 10全局区域上运行完美。

现在,你可能会指出可能是zbx_free()试图释放一些已经空闲的变量。我会说,不。因为我调试了代码,发现变量的分配是合法的,然后zbx_free()试图释放变量,从而引发SIGSEVG信号。

您可能想要查看宏zbx_free(request->key)(它是一个宏但是函数)。请看下面,因为这也很简单。

do              \
{               \
    if (request->key)       \
    {           \
        free(request->key); \
        request->key = ((void *)0); \
    }           \
}               \
while (0) 

所以,在我看来,这个问题徘徊在&#34;稀疏区域&#34;和&#34;全球区&#34;。我假设,Global zone将稀疏区域限制为free()内存分配。如果是真的,那么有人可以帮我解决这个问题吗?如果有的话,请建议我解决方法。

感谢您的时间。

此致

罗希特夏尔

1 个答案:

答案 0 :(得分:0)

@Petesh:

对不起,我的上一个答案。虽然它工作了一段时间但不是绝对的解决方案。该工具在释放内存以及内存分配点时崩溃了好几次。

后来,我尝试了valgrind来找到Linux上的解决方案。我发现了malloc的几种不正确的用法(比如更少的内存分配等)。我修复了它们,发现释放问题从未被打过。该工具此时尚未崩溃。感谢Valgrind和@Peetesh的推荐。