2016-01-30 62 views
3

我有一臺用C++編寫的服務器,它在osx上運行時會泄露Mach端口。具體來說,在運行top時,我注意到它有大約50000(在#PORTS下)。奇怪的是,我讓它在一夜之間運行,第二天機器基本上已經死機(花了15分鐘響應ctrl-c,沒有接受新的ssh連接),所以IT不得不重新啓動它。這樣的泄漏是否會導致系統崩潰?它沒有以root身份運行。我應該如何去調試Mach端口泄漏?

無論如何,有什麼好的策略來尋找這種泄漏的原因?有沒有好的工具?

我發現一個測試,當運行可靠泄漏5端口,但就是這樣。

編輯:我發現我們的線程類創建了一個mach端口泄漏,但我不明白爲什麼。在構造函數中,我們有下面的代碼:

// Initialize the default attributes. 
if (0 != pthread_attr_init(&m_threadAttributes)) 
{ 
    throw "blah"; 
} 

// Set the thread to be joinable. 
if (0 != pthread_attr_setdetachstate(&m_threadAttributes, PTHREAD_CREATE_JOINABLE)) 
{ 
    pthread_attr_destroy(&m_threadAttributes); 
    throw "blah"; 
} 

if (0 != pthread_create(
      &m_thread, 
      &m_threadAttributes, 
      &StartThreadFunction, 
      reinterpret_cast<void*>(this))) 
{ 
    throw "blah"; 
} 

而且我注意到端口數爲進程調用pthread_create,預計後上升的一個。

然後,後來我加入用下面的代碼線程:

if (0 != pthread_join(m_thread, NULL)) 
{ 
    throw "blah"; 
} 

而且不會拋出異常,所以我只能假設pthread_join返回0,因此成功,但在頂部沒有按端口#不要下去。還有什麼我需要做清理線程?

回答

2

您可以使用Dtrace來檢測正在運行的系統上的馬赫數端口使用情況。有許多mach_port相關的探測器:

sudo dtrace -l | grep mach_port

你可以寫一個DTrace腳本,跟蹤每個閹每個端口創建或保留的呼叫由相應的釋放平衡。跟蹤內存泄漏的Dtrace腳本將是一個有用的起點。

一旦你有一個爲你的目的工作的腳本you can use Instruments to control the trace session and graph the results

+0

是的,我早些時候試過dtrace,它可能是一個痛苦,獲得對本機的root權限...... – Bwmat