2011-07-14 213 views
2

在Linux中2.6.32-32,是有沒有辦法找到一個pthreads程序編程線程下列信息?我需要:運行計數,堆棧指針,堆棧開始/結束,堆棧大小,堆棧使用情況。我想,就像ThreadX,但在一個程序中。謝謝。線程堆棧指針

+0

目前,BjoernD –

+0

什麼是 '運行計數'?它在CPU上運行的次數?上下文切換的數量?時間片的數量? – bdonlan

+0

@bdonlan:我是在它運行的#次之後,但所有其他的,如果可能的話,也會很棒! –

回答

4
  • pthread_getattr_np()應該給你一個線程
  • pthread_attr_getstack()返回堆棧地址和大小
  • 我不知道你的運行計數的意思的並行線程屬性。
  • 比你目前的一個不同的線程,你可能需要使用ptrace的堆棧指針。一旦你有了它,你可以用它來做數學來確定使用多少堆棧。

爲了獲得自己的堆棧指針,你總是可以做線沿線的東西:

mword sp; 
asm volatile ("mov %esp, $0" : "=r"(sp)); 
+0

這是一個很好的答案,謝謝。也許你可以用sthg來幫助我:當讓系統使用默認值時,'pthread_attr_getstack()'返回「0」作爲大小和地址。有沒有一種方法可以在不通過'pthread_attr_setstackaddr()'和size來設置它們的情況下返回這些信息?再次感謝。 –

+0

@Dervin,堆棧大小可以是無限的。在Linux上,通常你會從一個堆棧頁面加上幾個保護頁面開始;如果您在防護頁上發生故障,堆棧將展開。線程可能會繼續增加堆棧直到遇到其他映射,此時它將會SIGBUS。這很難說明問題 - 正在進行不連續堆棧的工作;當你的堆棧中的空間用完時,它只會將你切換到一個新的堆棧段;當函數返回時,它將切換回舊堆棧。 – bdonlan

+0

嗯。我擔心繫統的默認值可能會有所不同。對於堆棧大小似乎是一個資源限制RLIMIT_STACK,您可以查詢:http://linux.die.net/man/2/setrlimit 有關如何查找從一開始不知道。您可能在線程的早期函數中讀取初始堆棧指針,然後假定堆棧與某個地址正確對齊,嘗試猜測堆棧區域的基址。儘管如此,這只是手動。 – BjoernD

3

作爲附錄BjoernD的回答,您可以獲取使用getrusage呼叫上下文切換次數和總運行時間與RUSAGE_THREAD。您無法獲得有關執行時間片的原始數量的信息;這些信息並沒有被首先跟蹤。

+0

謝謝你。我不得不接受BjoernD的答案,因爲他首先回答和正確的,但我已經upvoted你,我也upvoted你的答案的另一個之一(另一個問題),所以它幾乎等於被接受:) –