我知道没有标准的C函数来做到这一点.我想知道Windows和*nix上的技术是什么?(Windows XP是我现在最重要的操作系统.)
我有一个用C语言编写的程序,可以在Linux,MacOS和Windows上运行.有没有办法可以调用函数并生成堆栈跟踪?这对我来说非常有用.理想情况下,我想在所有三个平台上都这样做,但Linux是最重要的.(Windows正在通过mingw编译.)
谢谢.
好的,关于SO的第二个问题在一天之内.看起来像Windows编程让我开心......:S
我正在尝试在Win32可执行文件上获取函数调用堆栈.
今天早上,我也问了一个问题:
现在,我很确定该StackWalk64功能是关键.我已经阅读了一些关于如何使用它的文章,以及MS文档.
它实际上在我的测试程序中显示帧,所以它有点工作......
问题是我无法从堆栈信息中检索符号名称.
我正在使用这个SymGetSymFromAddr64功能UnDecorateSymbolName.但我只得到垃圾人物.
这是我的代码.希望它不要乱,因为我不熟悉Windows编程:
void printStack( void )
{
BOOL result;
HANDLE process;
HANDLE thread;
CONTEXT context;
STACKFRAME64 stack;
ULONG frame;
IMAGEHLP_SYMBOL64 symbol;
DWORD64 displacement;
char name[ 256 ];
RtlCaptureContext( &context );
memset( &stack, 0, sizeof( STACKFRAME64 ) );
process = GetCurrentProcess();
thread = GetCurrentThread();
displacement = 0;
stack.AddrPC.Offset = context.Eip;
stack.AddrPC.Mode = AddrModeFlat;
stack.AddrStack.Offset = context.Esp;
stack.AddrStack.Mode = AddrModeFlat;
stack.AddrFrame.Offset = context.Ebp;
stack.AddrFrame.Mode = AddrModeFlat;
for( …Run Code Online (Sandbox Code Playgroud) 我试图做的就是打印调用给定行的方法堆栈。我从/sf/answers/398963841/答案中得到了代码。稍微重构它以显示问题所在。
#include <windows.h>
#include <iostream>
#include <imagehlp.h>
#include <dbghelp.h>
void printStack( void ) {
HMODULE dbghelp_lib = LoadLibrary("dbghelp.dll");
if (NULL == dbghelp_lib) {
printf("dbghelp.dll failed");
}
HANDLE process = GetCurrentProcess();
if (!SymInitialize( process, NULL, TRUE )) {
printf("SymInitialize failed: %d\n", GetLastError());
abort();
} else SetLastError(0);
void * stack[100];
ULONG FramesToSkip = 0;
ULONG FramesToCapture = 32;
unsigned short frames = CaptureStackBackTrace( FramesToSkip, FramesToCapture, stack, NULL );
SYMBOL_INFO * symbol;
symbol = ( SYMBOL_INFO * )calloc( sizeof( SYMBOL_INFO ) …Run Code Online (Sandbox Code Playgroud)