相关疑难解决方法(0)

如何在C中获取堆栈跟踪?

我知道没有标准的C函数来做到这一点.我想知道Windows和*nix上的技术是什么?(Windows XP是我现在最重要的操作系统.)

c windows debugging cross-platform stack-trace

80
推荐指数
7
解决办法
10万
查看次数

应用程序可以以编程方式生成自己的堆栈跟踪吗?

我有一个用C语言编写的程序,可以在Linux,MacOS和Windows上运行.有没有办法可以调用函数并生成堆栈跟踪?这对我来说非常有用.理想情况下,我想在所有三个平台上都这样做,但Linux是最重要的.(Windows正在通过mingw编译.)

谢谢.

c stack-trace

14
推荐指数
2
解决办法
1971
查看次数

Windows上的StackWalk64 - 获取符号名称

好的,关于SO的第二个问题在一天之内.看起来像Windows编程让我开心......:S

我正在尝试在Win32可执行文件上获取函数调用堆栈.

今天早上,我也问了一个问题:

Win32 - 从C代码回溯

现在,我很确定该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)

c windows stack backtrace

10
推荐指数
2
解决办法
1万
查看次数

SymFromAddr 返回 ERROR_INVALID_ADDRESS 标志,如何在 mingw 中获取堆栈跟踪?

我试图做的就是打印调用给定行的方法堆栈。我从/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)

c c++ debugging winapi backtrace

5
推荐指数
1
解决办法
2370
查看次数

标签 统计

c ×4

backtrace ×2

debugging ×2

stack-trace ×2

windows ×2

c++ ×1

cross-platform ×1

stack ×1

winapi ×1