如何確定當前線程在多線程C++程序中使用的當前堆棧空間量?我正在使用POSIX pthreads。確定posix pthread的堆棧使用情況?
我有一個多線程程序,其中一個堆棧被炸燬,但我無法弄清楚哪一個。所以我有興趣讓每個線程向日志文件報告當前的堆棧使用情況,這應該是該線程的堆棧開始和當前堆棧指針之間的差異。我知道如何在彙編語言中做到這一點,但我正在尋找一種使用pthreads
調用或類似方法的便攜式方法。
謝謝。
如何確定當前線程在多線程C++程序中使用的當前堆棧空間量?我正在使用POSIX pthreads。確定posix pthread的堆棧使用情況?
我有一個多線程程序,其中一個堆棧被炸燬,但我無法弄清楚哪一個。所以我有興趣讓每個線程向日志文件報告當前的堆棧使用情況,這應該是該線程的堆棧開始和當前堆棧指針之間的差異。我知道如何在彙編語言中做到這一點,但我正在尋找一種使用pthreads
調用或類似方法的便攜式方法。
謝謝。
我有一個多線程程序,其中一個堆棧炸燬,但我找不出哪一個。
讓程序崩潰並保留core
文件。將core
加載到調試器中,並且它會立即告訴你哪個線程崩潰。
崩潰的線程不一定是溢出的線程。
確實有一種情況,一個線程溢出堆棧,但另一個線程因此崩潰。
但是,這種情況極其罕見(至少對於非用戶分配的線程堆棧 - pthread庫通常會提供一個堆棧保護頁來保護這一點)。我只能想到一個這樣的場景,而且在實踐中不太可能。
我正在尋找一種使用pthreads調用或類似方法的便攜式方法。
有沒有便攜式方式來實現你想要的。在Linux上,您可以使用pthread_getattr_np
和pthread_attr_getstack
來查找當前線程堆棧的邊界,並從那裏輕鬆計算當前堆棧的使用情況。
崩潰的線程不一定是溢出的線程。 – vy32
@ vy32我更新了我的答案。 –
爲每個線程保留堆棧空間,而不僅僅是使用。即你想要解決什麼問題?當你接近有限的堆棧保留時,你是否試圖停止運行amok,你無疑用'pthread_attr_setstack()'設置? – WhozCraig
我擴大了這個問題。 'pthread_attr_setstack'爲所創建的新線程設置堆棧大小。我想知道當前使用的堆棧空間量。 – vy32
考慮到你的問題的侷限性,局部作用域變量的地址與thread-proc頂部局部變量的地址相比可能就足夠了。甚至沒有*關閉*便攜式,但它可能會顯示問題。由於深*遞歸*(因此mondo激活幀)還是非常大的固定數組?然而,關於便攜式,我還沒有這樣的知識,甚至存在這樣的機制,但是自從我在pthreads-land以來,它已經有一段時間了。 – WhozCraig