访问分配给线程的堆栈

时间:2009-10-31 10:01:58

标签: c++ debugging

我想知道它是否可以访问堆栈(分配给用于存储局部变量的线程等)的内容。这有助于我以编程方式确定堆栈溢出问题。谢谢提前< / p>

3 个答案:

答案 0 :(得分:1)

不便携,没有。但是,根据您使用的平台,您可以设置每个线程的堆栈大小。例如,如果您正在使用POSIX线程,则可以使用pthread_attr_setstacksize来设置堆栈大小。

答案 1 :(得分:1)

在Unix上,您可以设置备用信号堆栈并使用它来检测堆栈溢出(炸弹后)。当你的线程命中溢出堆栈时(假设你或操作系统在那里放置一个防护页面),你可以查看sigcontext_t中的堆栈寄存器,看看是不是这样。

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

这都是非便携式的,但可能。

答案 2 :(得分:0)

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

但通常是由操作系统确定的堆栈溢出问题。当为线程或进程分配堆栈时,在它之前放置了特殊的内存段,禁用了对该段的读写操作。当您的堆栈用完时,您的应用程序将到达此段并访问它将导致系统异常。