如果我的C++应用程序在Windows上崩溃,我想向我们的服务器发送有用的调试信息.
在Linux上我会使用GNU backtrace()函数 - 是否有Windows的等价物?
有没有办法在程序崩溃后提取有用的调试信息?或者只是从过程中?
(根据"测试你的应用程序,所以它不会崩溃"的建议是没有用的! - 所有非平凡的程序都会有bug)
当我的c ++ linux应用程序崩溃时,我需要转储堆栈跟踪.我使用backtrace()和backtrace_symbols()成功地做到了这一点.现在,另外我想得到崩溃的行号.它是怎么做到的?
我正在写一个C++11软件而且我正在使用lambdas.当我打印回溯时,backtrace_symbols_fd除了lambda之外,所有函数都被解除了.这有点显而易见,因为它们是匿名函数,但有一种方法可以获得更多的洞察力而不是原始指针?
我在Linux上使用GCC 4.8
我使用visual c#来调试一个大型的c#项目.该项目非常庞大,只有一些pdbs是由我自己构建的.我可以构建所有的pdb但是它非常耗时.我正在调试回溯,但跟踪的一部分标有[外部代码].我知道有些pdb丢失了,但我怎么知道外部代码所在的DLL呢?在CI中可以获得EIP,然后查看流程映射以确定EIP的位置,但是如何在.Net环境中完成此操作?
我使用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) 我的程序是用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 …
好的,关于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) 我试图在执行我的(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) 我一直在从事Big C++项目,该项目的大小近300 MB,文件超过800个.我希望在二进制崩溃时获得调用堆栈,因此我捕获了Signal并将backtrace_symbols中的调用堆栈写入文件.但是要从backtrace_symbols获取符号名称,我已使用链接器标志'-rdynamic'进行编译.我想知道,使用'-rdynamic'会影响任何问题..?
我知道它会影响性能, 将-dynamic链接器选项添加到gcc/g ++会影响性能吗?
但它是否会影响性能......?
它是否暴露了我的源代码..?[我知道它不会,我只是想确定]
它是否会影响总运行时性能或启动时间..?
'rdynamic'有什么缺点..?