C++ 比Stackwalk快

C++ 比Stackwalk快,c++,windows,callstack,C++,Windows,Callstack,有人知道比“StackWalk”更好/更快的获取调用堆栈的方法吗? 我还认为stackwalk在有很多变量的方法上也会慢一些。。。 (我想知道商业专栏作家都做些什么?) 我在Windows上使用C++。 谢谢:)我不知道它是否更快,也不会显示任何符号,我相信您可以做得更好,但这是我不久前需要此信息时编写的一些代码(仅适用于Windows): struct CallStackItem { 作废*个人电脑; CallStackItem*下一步; CallStackItem() { pc=NULL;

有人知道比“StackWalk”更好/更快的获取调用堆栈的方法吗? 我还认为stackwalk在有很多变量的方法上也会慢一些。。。 (我想知道商业专栏作家都做些什么?) 我在Windows上使用C++。
谢谢:)

我不知道它是否更快,也不会显示任何符号,我相信您可以做得更好,但这是我不久前需要此信息时编写的一些代码(仅适用于Windows):

struct CallStackItem
{
作废*个人电脑;
CallStackItem*下一步;
CallStackItem()
{
pc=NULL;
next=NULL;
}
};
typedef void*CallStackHandle;
CallStackHandle CreateCurrentCallStack(int nLevels)
{
void**ppCurrent=NULL;
//获取当前保存的堆栈指针(由编译器保存在函数前缀上)。
__asm{mov-ppCurrent,ebp};
//如果nLevels不是正数,则不进行限制
如果(NL水平[0]上一个ebp
//[1]上一个程序计数器
CallStackItem*pResult=新的CallStackItem;
CallStackItem*pCurItem=pResult;
int nCurLevel=0;
//我们需要从堆栈中读取两个指针
int nRequiredMemorySize=sizeof(void*)*2;
while(nCurLevelpc=ppCurrent[1];
pCurItem->next=新建CallStackItem;
//转到先前保留的ebp
ppCurrent=(无效**)*ppCurrent;
pCurItem=pCurItem->next;
++nCurLevel;
}
回归预设;
}
void PrintCallStack(CallStackHandle hCallStack)
{
CallStackItem*pCurItem=(CallStackItem*)hCallStack;
printf(“----调用堆栈开始------\n”);
while(pCurItem)
{
printf(“0x%08x\n”,pCurItem->pc);
pCurItem=pCurItem->next;
}
printf(“----调用堆栈结束------\n”);
}
void ReleaseCallStack(CallStackHandle hCallStack)
{
CallStackItem*pCurItem=(CallStackItem*)hCallStack;
CallStackItem*pPrevItem;
while(pCurItem)
{
pPrevItem=pCurItem;
pCurItem=pCurItem->next;
删除pPrevItem;
}
}
签出-这是“CaptureStackBackTrace”,尽管它被称为“RtlCaptureStackBackTrace”。

我使用Jochen Kalmbachs

以这种方式加速它

  • 在默认目录和PDB服务器中查找
    PDB文件
    的时间最多

  • 我只使用
    一个PDB路径
    ,并为我想要解析的图像实现了一个
    白名单
    (我不需要查找user32.PDB)

  • 有时我不需要潜到底部,所以我定义了一个
    max deep

代码更改:

BOOL StackWalker::LoadModules()
{

    ...

    // comment this line out and replace to your pdb path
    // BOOL bRet = this->m_sw->Init(szSymPath);
    BOOL bRet = this->m_sw->Init(<my pdb path>);

    ...

}

BOOL StackWalker::ShowCallstack(int iMaxDeep /* new parameter */ ... )
{

    ... 

// define a maximal deep
// for (frameNum = 0; ; ++frameNum )
    for (frameNum = 0; frameNum < iMaxDeep; ++frameNum )
    {

        ... 

    }
}
boolstackwalker::LoadModules()
{
...
//注释此行并替换为您的pdb路径
//BOOL-bRet=this->m_-sw->Init(szSymPath);
BOOL-bRet=this->m_-sw->Init();
...
}
BOOL StackWalker::ShowCallstack(int-iMaxDeep/*新参数*/…)
{
... 
//定义最大深度
//对于(frameNum=0;;++frameNum)
对于(frameNum=0;frameNum
Valgrind?嗯……Valgrind不只是用于unix吗?Valgrind正在检测,我正在寻找一种更好的方法来对堆栈进行采样……为什么StackWalk对您来说不够快?您需要它做什么?我遇到了同样的问题。我编写了一个泄漏跟踪智能指针,它依赖于
StackWalk
,但速度非常慢。像Proc这样的应用程序如何运行ess Monitor是否这样做(因为PM以难以置信的速度记录每个文件/注册表访问的堆栈)?
BOOL StackWalker::LoadModules()
{

    ...

    // comment this line out and replace to your pdb path
    // BOOL bRet = this->m_sw->Init(szSymPath);
    BOOL bRet = this->m_sw->Init(<my pdb path>);

    ...

}

BOOL StackWalker::ShowCallstack(int iMaxDeep /* new parameter */ ... )
{

    ... 

// define a maximal deep
// for (frameNum = 0; ; ++frameNum )
    for (frameNum = 0; frameNum < iMaxDeep; ++frameNum )
    {

        ... 

    }
}