我正在开发一个开源工具" 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()内存分配。如果是真的,那么有人可以帮我解决这个问题吗?如果有的话,请建议我解决方法。
感谢您的时间。
此致
罗希特夏尔
答案 0 :(得分:0)
@Petesh:
对不起,我的上一个答案。虽然它工作了一段时间但不是绝对的解决方案。该工具在释放内存以及内存分配点时崩溃了好几次。
后来,我尝试了valgrind来找到Linux上的解决方案。我发现了malloc的几种不正确的用法(比如更少的内存分配等)。我修复了它们,发现释放问题从未被打过。该工具此时尚未崩溃。感谢Valgrind和@Peetesh的推荐。