C++ 访问分配给线程的堆栈

C++ 访问分配给线程的堆栈,c++,debugging,C++,Debugging,我想知道是否可以通过编程方式访问堆栈(分配给用于存储局部变量等的线程)内容。这有助于我通过编程方式确定堆栈溢出问题。提前感谢您,不可移植。但是,根据您使用的平台,您可以为每个线程设置堆栈大小。例如,如果使用POSIX线程,则可以使用设置堆栈大小。没有可移植的方法。您可以使用内联汇编程序确定线程中的当前堆栈指针,然后在进程内存映射中找到具有此地址的块 但通常堆栈溢出问题是由操作系统决定的。当堆栈被分配给线程或进程时,有一个特殊的内存段放在它前面,对该段的读写被禁用。当堆栈用完时,应用程序到达该段,

我想知道是否可以通过编程方式访问堆栈(分配给用于存储局部变量等的线程)内容。这有助于我通过编程方式确定堆栈溢出问题。提前感谢您,不可移植。但是,根据您使用的平台,您可以为每个线程设置堆栈大小。例如,如果使用POSIX线程,则可以使用设置堆栈大小。

没有可移植的方法。您可以使用内联汇编程序确定线程中的当前堆栈指针,然后在进程内存映射中找到具有此地址的块


但通常堆栈溢出问题是由操作系统决定的。当堆栈被分配给线程或进程时,有一个特殊的内存段放在它前面,对该段的读写被禁用。当堆栈用完时,应用程序到达该段,访问该段将导致系统异常。

在Unix上,您可以设置备用信号堆栈,并使用它检测堆栈溢出(爆炸后)。当线程命中溢出堆栈时(假设您或操作系统在那里放置了一个保护页),您可以查看sigcontext\t中的堆栈寄存器,看看这是否是原因

如果您希望以编程方式防止堆栈溢出,请分配您自己的线程堆栈,然后定期对堆栈指针值进行采样(您必须处理堆栈基位置以及如何采样堆栈指针等不可移植的问题)。对于单线程程序,可以使用main中采样的堆栈基,与进程堆栈ulimit进行比较,以查看是否走得太远


这些都是不可携带的,但这是可能的。

感谢您的回复,它帮助我了解了它的一些其他方面。但是是否有工具可用于检测此类溢出。假设我的应用程序有三个线程正在运行。那么有没有办法从编程角度找到导致堆栈溢出的线程?您可以分析线程的堆栈指针-它应该是一个最接近异常地址