2014-06-26 37 views
-1

我正在開發一個開源工具「zabbix」,它在Solaris 10的RHEL/Global Zone上工作得很好。但是當我嘗試在Solaris 10的稀疏區域上運行此工具時,問題似乎令人困惑。在稀疏該工具有時會起作用,有時它會與SIGSEGV信號一起崩潰。該信號在釋放由變量分配的內存時被提升。free()在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) 

所以,在我看來,問題在「稀疏區」和「全球區」之間盤旋。我認爲,全局區域限制稀疏區域釋放()內存分配。如果是這樣,那麼有人可以幫我解決這個問題嗎?請告訴我解決方法,如果有的話。

謝謝你的時間。

問候,

羅希特

+0

是否有可能你已經分配了更少的內存到稀疏區域,並且其中一個分配失敗了,這導致了自由導致了'SEGV'? – Petesh

+0

@Petesh:它已經分配了將近7.3GB的內存。 – Rohit

+2

如果是linux,我會哭泣使用valgrind,但稍微更solaris的解決方案是使用'libumem'。 'LD_PRELOAD = libumem.so.1 UMEM_DEBUG =默認run_app'。我*認真*懷疑這是一個區域的事情。 – Petesh

回答

0

@Petesh:

對不起,我最後的答案。雖然它工作了一段時間,但不是一個絕對的解決方案。該工具在釋放內存以及內存分配的時候崩潰了幾次。

後來,我試着在valgrind上找到Linux上的解決方案。我發現了malloc的一些不正確的用法(比如更少的內存分配大小等)。我修復了它們,發現解放問題從未迴應過。該工具從未崩潰。感謝Valgrind和@Peetesh的推薦。

相關問題