如何在不使用dbghelp.dll的情况下在Windows上获取堆栈跟踪?

时间:2008-12-24 23:16:31

标签: c++ c stack stack-trace dbghelp

如何在不使用dbghelp.dll的情况下在Windows上获取地址堆栈跟踪?

我不需要知道与地址相关的符号或函数名称,我只想要地址列表 - 类似于 backtrace of *nix systems

谢谢!

3 个答案:

答案 0 :(得分:9)

查看Kernel32.dll中的CaptureStackBackTrace()函数。这应该做你需要的一切。

  

通过向上移动堆栈并记录每个帧的信息来捕获堆栈后退跟踪。

USHORT WINAPI CaptureStackBackTrace(
  __in       ULONG FramesToSkip,
  __in       ULONG FramesToCapture,
  __out      PVOID *BackTrace,
  __out_opt  PULONG BackTraceHash
);

答案 1 :(得分:2)

如果您想以非易移的方式执行,您只需阅读EBP寄存器并自行走动堆栈即可。这仅适用于x86体系结构,并且它还假定您正在使用的C运行时在调用第一个函数之前将EBP正确初始化为0.

uint32_t read_ebp(void)
{
    uint32_t my_ebp;
    __asm
    {
        mov ebp, my_ebp
    }

    return my_ebp;
}

void backtrace(void)
{
    uint32_t ebp = read_ebp();

    printf("backtrace:\n");

    while(ebp != 0)
    {
        printf("0x%08x\n", ebp);
        ebp = ((uint32_t *)ebp)[1];
    }
}

答案 2 :(得分:1)

以前的变体对我不起作用(msvc 6),所以:

unsigned long prev;
unsigned long addr;
__asm { mov prev, ebp }
while(addr!=0) { 
  addr = ((unsigned long *)prev)[1]; 
  printf("0x%08x\n", addr); 
  prev = ((unsigned long *)prev)[0]; 
}
亚当,谢谢你突出道路!