2011-07-14 124 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你的答案的另一个之一(另一个问题),所以它几乎等于被接受:) –