相关疑难解决方法(0)

我的程序崩溃时如何自动生成堆栈跟踪

我正在使用GCC编译器在Linux上工作.当我的C++程序崩溃时,我希望它能自动生成一个堆栈跟踪.

我的程序由许多不同的用户运行,它也可以在Linux,Windows和Macintosh上运行(所有版本都使用编译gcc).

我希望我的程序能够在崩溃时生成堆栈跟踪,并且在用户下次运行它时,它会询问他们是否可以将堆栈跟踪发送给我,以便我可以追踪问题.我可以处理向我发送信息,但我不知道如何生成跟踪字符串.有任何想法吗?

c++ crash gcc assert stack-trace

561
推荐指数
20
解决办法
33万
查看次数

如何获得更详细的回溯

当我的C++程序终止时,我正在尝试打印回溯.功能打印回溯如下所示;

   void print_backtrace(void){

       void *tracePtrs[10];
       size_t count;

       count = backtrace(tracePtrs, 10);

       char** funcNames = backtrace_symbols(tracePtrs, count);

       for (int i = 0; i < count; i++)
           syslog(LOG_INFO,"%s\n", funcNames[i]);

       free(funcNames);

}
Run Code Online (Sandbox Code Playgroud)

它给出了类似的输出;

   desktop program: Received SIGSEGV signal, last error is : Success
   desktop program: ./program() [0x422225]
   desktop program: ./program() [0x422371]
   desktop program: /lib/libc.so.6(+0x33af0) [0x7f0710f75af0]
   desktop program: /lib/libc.so.6(+0x12a08e) [0x7f071106c08e]
   desktop program: ./program() [0x428895]
   desktop program: /lib/libc.so.6(__libc_start_main+0xfd) [0x7f0710f60c4d]
   desktop program: ./program() [0x4082c9]
Run Code Online (Sandbox Code Playgroud)

有没有办法获得更详细的函数名称和行回溯,如gdb输出?

c linux

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

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万
查看次数

标签 统计

c ×2

assert ×1

backtrace ×1

c++ ×1

crash ×1

gcc ×1

linux ×1

stack ×1

stack-trace ×1

windows ×1