Articles of 回溯

在Linux上可以使用backtrace()来替代静态函数的符号

在手册页上,Linux上的backtrace()函数说: 请注意,“静态”函数的名称没有公开,并且在回溯中不可用。 但是,启用debugging符号( -g )后,像addr2line和gdb这样的程序仍然可以获得静态函数的名称。 有没有办法从过程本身编程获取静态function的名称?

问号是什么意思? 在Linux内核恐慌调用跟踪?

呼叫跟踪包含这样的条目: [<deadbeef>] FunctionName+0xAB/0xCD [module_name] [<f00fface>] ? AnotherFunctionName+0x12/0x40 [module_name] [<deaffeed>] ClearFunctionName+0x88/0x88 [module_name] 这个'?'是什么意思? 在AnotherFunctionName之前标记?

从catch块获取回溯

我正在使用backtrace从exception被引发的地方获取信息。 在我的exception的构造函数中,我将回溯存储在std :: string中,并在catch块中为此types的exception打印此回溯。 但我想知道,是否有可能以某种方式在其他exceptiontypes的catch块中获得相同的回溯?

如何使backtrace()/ backtrace_symbols()打印函数名?

Linux特定的backtrace()和backtrace_symbols()允许你产生程序的调用轨迹。 但是,它只打印function地址,而不是我的程序的名称。 我怎样才能让他们打印函数名称呢? 我试着用-g和-ggdb编译程序。 下面的testing用例只是打印这个: 后退———— ./a.out()[0x8048616] ./a.out()[0x8048623] /lib/libc.so.6(__libc_start_main+0xf3)[0x4a937413] ./a.out()[0x8048421] ———————- 我想要前两个项目也显示函数名称, foo和main 码: #include <execinfo.h> #include <string.h> #include <errno.h> #include <unistd.h> #include <stdlib.h> static void full_write(int fd, const char *buf, size_t len) { while (len > 0) { ssize_t ret = write(fd, buf, len); if ((ret == -1) && (errno != EINTR)) break; buf […]

获取其他线程的回溯

在Linux中,为了获得回溯,可以使用backtrace()库调用,但它只返回当前线程的回溯。 有什么办法得到其他线程的回溯,假设我知道它是TID(或pthread_t),我可以保证睡觉? 看来,libunwind(http://www.nongnu.org/libunwind/)项目可以提供帮助。 问题是CentOS不支持它,所以我不喜欢使用它。 任何其他的想法? 谢谢。

Windows上的StackWalk64 – 获取符号名称

好的,第二个问题就在一天。 看起来Windows编程让我开心…:S 我目前正在试图获取Win32可执行文件的函数调用堆栈。 今天早上,我也问了一个关于这个问题: Win32 – 从C代码回溯 现在,我很确定StackWalk64函数是这个关键。 我已经阅读了一些关于如何使用它的文章,以及MS文档。 它实际上显示我的testing程序框架,所以它有点工作… 问题是我无法从堆栈信息中检索符号名称。 我正在使用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 […]

如何从崩溃中提取debugging信息

如果我的C ++应用程序在Windows上崩溃,我想发送有用的debugging信息到我们的服务器。 在Linux上,我会使用GNU的backtrace()函数 – 是否有相当于Windows? 程序崩溃后,有没有办法提取有用的debugging信息? 还是只从内部过程? (build议“testing你的应用程序,所以它不会崩溃”没有帮助! – 所有不平凡的程序都会有错误)