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

标签 c free solaris-10

我正在开发一个开源工具“zabbix”,它在 Solaris 10 的 RHEL/全局区域上运行得非常好。但是当我尝试在 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) 

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

感谢您的宝贵时间。

问候,

罗希特

最佳答案

@Petesh:

抱歉我上次的回答。虽然它确实有效了一段时间,但并不是绝对的解决方案。该工具在释放内存以及内存分配时崩溃了几次。

后来我在Linux上尝试valgrind找到了解决方案。我发现了一些 malloc 的不当使用(例如内存分配的大小较小等)。我修复了它们,发现释放问题从未消失。该工具目前还没有崩溃过。感谢 Valgrind 和 @Peetesh 的推荐。

关于c - free() 在Solaris 10 的稀疏区域上随机返回SIGSEGV。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24426833/

相关文章:

c free()函数问题

c - PIC24 上的 Free() 段错误

c - 为什么调用 execvp 时此 free 会失败?

git - 如何在 Solaris 10 上安装 Git?

c++ - ld : fatal: library -lm: not found in solaris 10

C潜在的内存泄漏malloc

c - C CUDA代码中的访问冲突

TPT 中基于代码的测试相对于基于模型的测试

使用 OpenSSL 在 Solaris 上编译 C 文件包括

c - POSIX C API 中的随机数