任何人都可以告诉我两种类型的堆栈有什么不同。
如果我看到/proc/<pid>/map
和proc/pid/task/<tid>
,我会看到相同的地图。有没有办法我们可以独立地看到属于线程的堆栈(我的意思是不是进程线程的堆栈)或者是否有任何gdb命令来找出特定于线程的堆栈。
谢谢, 卡皮尔
答案 0 :(得分:2)
有没有办法可以看到专属于线程的堆栈
没有这样的事情:所有线程共享整个地址空间,因此堆栈不“完全属于”任何给定的线程。实际上,您可以获取局部变量的地址,并将该地址传递给另一个线程,然后该线程可以读取或写入值。
我相信你要问的是“如何判断/proc/<pid>/maps
中哪个内存区域是当前使用的线程X作为其堆栈?”。如果这是问题,您可以print $sp
找出您感兴趣的主题的当前堆栈指针,然后找到/proc/<pid>/maps
中与$sp
重叠的区域。
答案 1 :(得分:0)
您可以使用info threads
并使用thread <id>
您可以键入thread apply all info registers
来打印所有线程的当前寄存器。
或者例如thread apply all bt
打印所有线程的回溯。
答案 2 :(得分:0)
@Employedrussian
There is no such thing: all the threads share the entire address space, so the stack
doesn't "belong exclusively" to any given thread. In fact, you can take an address of a
local variable, and pass that address to a different thread, which can then read or write
values to it.
What I believe you are asking is "how to tell which memory region in /proc/<pid>/maps is
thread X currently using as its stack?". If that's the question, you can print $sp to
find out current stack pointer for the thread you are interested in, and then find a
region in /proc/<pid>/maps that overlaps $sp.
是的,它们共享整个地址空间,并且线程拥有自己的堆栈也是如此,但这仍然没有解释线程的堆栈如何与另一个线程或者进程线程的堆栈不同。我的意思是,如果这是我们可以想象它的方式:
+--------+ stack vma start
| +--+ |
| +--+ <------- stack of process
| +--+ |
| +--+ |
| : : |
| |
| |
| +--+ |
| +--+ <------- stack of thread1
| +--+ |
| +--+ |
| : : |
| |
| |
| +--+ |
| +--+ |
| +--+ <------ stack of thread2
| +--+ |
| : : |
: :
: :
+--------+ stack vma end
(可能是我在这方面完全错了,但这只是为了澄清事情)
关于传递地址(局部变量),当你将它作为地址传递时,你可以读取或写入该存储器位置,这是指针的固有属性。
答案 3 :(得分:0)
为了完整起见,我在这里能够理解我所能理解的一切。
上面发布的图表是错误的,应该这样修改:
Process address Space:
+----------------------------------------------------+
| |
: :
: :
| |
| +--------+ thread2 stack vma start |
| | +--+ | |
| | +--+ | |
| | +--+ | |
| | +--+ | | stack grows downwards |
| | : : | | |
| : : V |
| : : |
| +--------+ thread2 stack vma ends |
| |
| |
| +--------+ thread1 stack vma start |
| | +--+ | |
| | +--+ | |
| | +--+ | |
| | +--+ | | stack grows downwards |
| | : : | | |
| : : V |
| : : |
| +--------+ thread1 stack vma ends |
| |
| |
| +--------+ Process stack vma start |
| | +--+ | |
| | +--+ | |
| | +--+ | |
| | +--+ | | stack grows downwards |
| | : : | | |
| : : V |
: : : :
: +--------+ Process stack vma ends :
: :
+----------------------------------------------------+
theads从mmap的内存中获取他们独立的堆栈。我在谈论glibc中的POSIX实现。有关更好的参考,请参阅函数allocate_stack() 在glibc中的nptl。