标签: backtrace

如何从崩溃中提取调试信息

如果我的C++应用程序在Windows上崩溃,我想向我们的服务器发送有用的调试信息.

在Linux上我会使用GNU backtrace()函数 - 是否有Windows的等价物?

有没有办法在程序崩溃后提取有用的调试信息?或者只是从过程中?

(根据"测试你的应用程序,所以它不会崩溃"的建议是没有用的! - 所有非平凡的程序都会有bug)

c++ windows crash stack-trace backtrace

11
推荐指数
1
解决办法
5527
查看次数

有没有办法从Linux发布二进制文件中转储带有行号的堆栈跟踪?

当我的c ++ linux应用程序崩溃时,我需要转储堆栈跟踪.我使用backtrace()和backtrace_symbols()成功地做到了这一点.现在,另外我想得到崩溃的行号.它是怎么做到的?

c++ linux backtrace

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

如何在回溯上显示lambda函数?

我正在写一个C++11软件而且我正在使用lambdas.当我打印回溯时,backtrace_symbols_fd除了lambda之外,所有函数都被解除了.这有点显而易见,因为它们是匿名函数,但有一种方法可以获得更多的洞察力而不是原始指针?

我在Linux上使用GCC 4.8

c++ lambda gcc backtrace c++11

11
推荐指数
1
解决办法
921
查看次数

Visual C#backtrace:如何知道[外部代码]所在的位置?

我使用visual c#来调试一个大型的c#项目.该项目非常庞大,只有一些pdbs是由我自己构建的.我可以构建所有的pdb但是它非常耗时.我正在调试回溯,但跟踪的一部分标有[外部代码].我知道有些pdb丢失了,但我怎么知道外部代码所在的DLL呢?在CI中可以获得EIP,然后查看流程映射以确定EIP的位置,但是如何在.Net环境中完成此操作?

c# debugging backtrace

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

跟踪Ruby中的死锁

我使用BrB共享Ruby 1.9中各种工作进程的数据源,我使用Process#fork进行分叉,如下所示:

Thread.abort_on_exception = true

fork do
  puts "Initializing data source process... (PID: #{Process.pid})"
  data = DataSource.new(files)

  BrB::Service.start_service(:object => data, :verbose => false, :host => host, :port => port)
  EM.reactor_thread.join
end
Run Code Online (Sandbox Code Playgroud)

工人分叉如下:

8.times do |t|  
  fork do
    data = BrB::Tunnel.create(nil, "brb://#{host}:#{port}", :verbose => false)

    puts "Launching #{threads_num} worker threads... (PID: #{Process.pid})"    

    threads = []
    threads_num.times { |i|
      threads << Thread.new {
        while true
          begin
            worker = Worker.new(data, config)

          rescue OutOfTargetsError
            break

          rescue Exception => e
            puts "An unexpected …
Run Code Online (Sandbox Code Playgroud)

ruby multithreading deadlock locking backtrace

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

gdb奇怪的回溯

我的程序是用dietlibc静态编译的.它是在ubuntu x64上编译的(使用-m32标志为x86编译),并在centos x86上运行.

编译后的大小只有大约100KB.我用-ggdb3编译它,没有优化标志.

我的程序使用signal.h来处理SIGSEGV信号,然后调用abort().

程序运行好几天但有时会出现段错误.这是我得到奇怪的回溯,我不明白:

username@ubuntu:~/Desktop$ gdb -c core.28569 program-name
GNU gdb (GDB) 7.2
Copyright (C) 2010 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-linux-gnu --target=i386-linux-gnu".
For bug reporting instructions, please see:
...
Reading symbols from program-name...done.
[New Thread …

c gdb coredump backtrace

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

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 ++)程序的某个时刻获得回溯.

因为我正在使用backtrace和backtrace_symbols.这方面的东西:

std::string stacktrace( unsigned int frames_to_skip )
{
    std::string str;

    void* stack_addrs[50];
    int trace_size = backtrace( stack_addrs, 50 );
    char** stack_strings = backtrace_symbols( stack_addrs, trace_size );

    str += "[bt] backtrace:\n";
    // skip frames_to_skip stack frames
    for( int i = frames_to_skip; i < trace_size; ++i )
    {
        char tmp[4096];
        sprintf( tmp, "[bt] #%d %s\n", i-frames_to_skip, stack_strings[i] );
        str += tmp;
    }

    free( stack_strings );

    return str;
}
Run Code Online (Sandbox Code Playgroud)

它有效,但缺少一些函数名称.例:

[bt] #0 /path/to/executable() [0x43e1b5]
[bt] #1 /path/to/executable() [0x43e0cd]
[bt] #2 /path/to/executable() …
Run Code Online (Sandbox Code Playgroud)

c++ gcc g++ backtrace

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

带有-static和-rdynamic的backtrace_symbols()

看看这个问题这个问题,我可以看到,为了backtrace_symbols()工作,必须用-rdynamic旗子编译.

我试过它变成一个测试程序和它的作品,但我正在写也与编译的程序-static这个页面说,backtrace_symbols()当不工作-static被传递到编译器/连接.

有没有快速的解决方法,或者我的静态链接程序中永远不会有人类可读的回溯功能?

c c++ symbols backtrace static-linking

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

rdynamic gcc选项的影响/缺点

我一直在从事Big C++项目,该项目的大小近300 MB,文件超过800个.我希望在二进制崩溃时获得调用堆栈,因此我捕获了Signal并将backtrace_symbols中的调用堆栈写入文件.但是要从backtrace_symbols获取符号名称,我已使用链接器标志'-rdynamic'进行编译.我想知道,使用'-rdynamic'会影响任何问题..?

我知道它会影响性能, 将-dynamic链接器选项添加到gcc/g ++会影响性能吗?

但它是否会影响性能......?

它是否暴露了我的源代码..?[我知道它不会,我只是想确定]

它是否会影响总运行时性能或启动时间..?

'rdynamic'有什么缺点..?

c++ linker backtrace

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