我正在開發一個開源工具「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)
所以,在我看來,問題在「稀疏區」和「全球區」之間盤旋。我認爲,全局區域限制稀疏區域釋放()內存分配。如果是這樣,那麼有人可以幫我解決這個問題嗎?請告訴我解決方法,如果有的話。
謝謝你的時間。
問候,
羅希特
是否有可能你已經分配了更少的內存到稀疏區域,並且其中一個分配失敗了,這導致了自由導致了'SEGV'? – Petesh
@Petesh:它已經分配了將近7.3GB的內存。 – Rohit
如果是linux,我會哭泣使用valgrind,但稍微更solaris的解決方案是使用'libumem'。 'LD_PRELOAD = libumem.so.1 UMEM_DEBUG =默認run_app'。我*認真*懷疑這是一個區域的事情。 – Petesh