在Linux上获取堆栈边界

时间:2020-07-27 06:49:13

标签: linux

在Windows上,我可以像这样从Thread Information Block获取堆栈边界:

    void  *stackBottom,
          *stackTop;
#if defined _MSC_VER
    void **teb  = (void **)NtCurrentTeb();
    stackBottom = teb[2];
    stackTop    = teb[1];
#else
    #error "unsupported platform"
#endif

...或使用GetCurrentThreadStackLimits()。但是GetCurrentThreadStackLimits()不会返回当前分配的堆栈的边界(Windows会过量使用堆栈),而是返回堆栈的整个地址范围,直至最终可能扩展到的位置。

在Linux上是否可以实现上述类似的功能?

[编辑]我知道了:

#include <iostream>
#include <pthread.h>

using namespace std;

int main()
{
    pthread_attr_t attrs;
    if( pthread_getattr_np( pthread_self(), &attrs ) != 0 )
        return -1;
    void   *stackAddr;
    size_t  stackSize;
    if( pthread_attr_getstack( &attrs, &stackAddr, &stackSize ) != 0 )
        return -1;
    cout << "stack-address: " << stackAddr          << endl;
    cout << "stack-size:    " << stackSize          << endl;
    cout << "var-addr:      " << (void *)&stackAddr << endl;
}

这确定堆栈的基地址及其大小。如var_addr所示,stackAddr是下限,即堆栈从(char *)stackAddr + stackSize开始。接下来要做的就是确定代码的性能。

0 个答案:

没有答案