如何在不使用dbghelp.dll的情况下获取Windows上地址的堆栈跟踪?如何在不使用dbghelp.dll的情况下在Windows上获取堆栈跟踪?
我不需要知道与地址相关的符号或函数名称,我只想要地址列表 - 类似于backtrace of *nix systems。
谢谢!
如何在不使用dbghelp.dll的情况下获取Windows上地址的堆栈跟踪?如何在不使用dbghelp.dll的情况下在Windows上获取堆栈跟踪?
我不需要知道与地址相关的符号或函数名称,我只想要地址列表 - 类似于backtrace of *nix systems。
谢谢!
查看CaptureStackBackTrace()函数,该函数位于Kernel32.dll中。这应该做你需要的一切。
通过走上堆栈并记录每个帧的信息来捕获堆栈返回跟踪。
USHORT WINAPI CaptureStackBackTrace(
__in ULONG FramesToSkip,
__in ULONG FramesToCapture,
__out PVOID *BackTrace,
__out_opt PULONG BackTraceHash
);
如果你想这样做极其非可移植的,你可以阅读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];
}
}
上一页变体不为我工作(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];
}
亚当,感谢突出的方式!
你为什么要这样做没有DbgHelp.dll。从Windows 2000开始,DbgHelp.dll就是内置于Windows的。同时查看Jochen Kalmbach的Stackwalker:http://www.codeproject.com/KB/threads/StackWalker.aspx – Cheeso 2009-10-25 02:50:53