我有一臺用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,因此成功,但在頂部沒有按端口#不要下去。還有什麼我需要做清理線程?
是的,我早些時候試過dtrace,它可能是一個痛苦,獲得對本機的root權限...... – Bwmat