标签: backtrace

是否有对addr2line的库调用?

我需要从C++程序中获取addr2line提供的信息(来自回溯函数调用的文件和行).是否有类似于addr2line的库调用?

编辑:我在Linux环境中工作.

我知道我可以直接调用addr2line,我知道我可以在我的程序中使用addr2line 的源代码(也是GPL许可).但我想调用库函数(如果存在)更清晰.

编辑:我将使用binutils的bfd,就像addr2line一样.无论如何,bfd意味着什么?

c c++ linux backtrace addr2line

20
推荐指数
2
解决办法
7669
查看次数

如何在RSpec 2中缩短测试失败的回溯?

当我的规格出现错误时,我收到如下消息:

Vendor should reject duplicate names
     Failure/Error: user_with_duplicate_email.should_not be_valid
     expected valid? to return false, got true
     # /home/kevin/.rvm/gems/ruby-1.9.2-p136@rails3tutorial/gems/rspec-expectations-2.3.0/lib/rspec/expectations/fail_with.rb:29:in `fail_with'
     # /home/kevin/.rvm/gems/ruby-1.9.2-p136@rails3tutorial/gems/rspec-expectations-2.3.0/lib/rspec/expectations/handler.rb:44:in `handle_matcher'
     # /home/kevin/.rvm/gems/ruby-1.9.2-p136@rails3tutorial/gems/rspec-expectations-2.3.0/lib/rspec/expectations/extensions/kernel.rb:50:in `should_not'
.
.
about 15 more lines
.
.
     # /home/kevin/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/drb/drb.rb:1592:in `block (2 levels) in main_loop'
     # /home/kevin/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/drb/drb.rb:1588:in `loop'
     # /home/kevin/.rvm/rubies/ruby-1.9.2-p136/lib/ruby/1.9.1/drb/drb.rb:1588:in `block in main_loop'
Run Code Online (Sandbox Code Playgroud)

我正在运行Ruby 1.0.2,rails(3.0.3)和rspec(2.3.0).M .rspec配置文件只指定了两个选项:

--drb --colour

如何关闭扩展跟踪?

rspec backtrace

18
推荐指数
1
解决办法
1473
查看次数

获得其他线程的回溯

在Linux中,要获得回溯,您可以使用backtrace()库调用,但它只返回当前线程的回溯.有没有办法得到一些其他线程的回溯,假设我知道它的TID(或pthread_t),我可以保证它睡觉?

似乎libunwind(http://www.nongnu.org/libunwind/)项目可以提供帮助.问题是CentOS不支持它,所以我不想使用它.

还有其他想法吗?谢谢.

linux multithreading backtrace

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

使用-funwind-tables进行编译时到底发生了什么?

来自:https://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html

-fexceptions:启用异常处理.生成传播异常所需的额外代码.对于某些目标,这意味着GCC为所有函数生成帧展开信息,

-funwind-tables类似于-fexceptions,它只是生成任何所需的静态数据,但不会以任何其他方式影响生成的代码.您通常不需要启用此选项; 相反,需要此处理的语言处理器代表您启用它.

有人可以解释一下-funwind-tables"任何需要的静态数据"是什么意思.他们指的是什么数据.为什么需要生成数据?如果没有生成数据会怎么样?这些数据用于哪里?

它也说"类似于-fexception".所以我认为它也会生成帧展开信息.什么是帧展开信息?谁使用框架信息以及如何使用?

在一些SO帖子中,我读到必须使用此标志编译程序_Unwind_Backtrace才能正常工作.请解释如何_Unwind_Backtrace使用生成的信息-funwind-tables.

c c++ gcc compilation backtrace

16
推荐指数
1
解决办法
1962
查看次数

从catch块获取回溯

我正在使用backtrace从抛出异常的位置获取信息.在我的异常的构造函数中,我将回溯存储在std :: string中,并且在catch块中为此类型的异常存储,我正在打印此回溯.

但我想知道,是否有可能以某种方式在catch块中为其他异常类型获得相同的回溯?

c++ linux exception-handling backtrace

15
推荐指数
2
解决办法
8377
查看次数

x86_64调用约定和堆栈帧

我试图理解GCC(4.4.3)为在Ubuntu Linux下运行的x86_64机器生成的可执行代码.特别是,我不明白代码如何跟踪堆栈帧.在过去,在32位代码中,我习惯于在几乎每个函数中看到这个"序幕":

push %ebp
movl %esp, %ebp
Run Code Online (Sandbox Code Playgroud)

然后,在功能结束时,也会出现"结局"

sub $xx, %esp   # Where xx is a number based on GCC's accounting.
pop %ebp
ret
Run Code Online (Sandbox Code Playgroud)

或者干脆

leave
ret
Run Code Online (Sandbox Code Playgroud)

这完成了同样的事情:

  • 将堆栈指针设置为当前帧的顶部,就在返回地址的正下方
  • 恢复旧的帧指针值.

在64位代码中,正如我通过objdump反汇编看到的那样,许多函数不遵循这个约定 - 它们不会推送%rbp然后将%rsp保存到%rbp,像GDB这样的调试器如何构建回溯?

我的真正目标是尝试找出一个合理的地址,当执行到达程序中的任意函数的开始时,可​​以将堆栈指针向下移动时作为用户堆栈的顶部(最高地址).例如,对于"top",argv的原始地址是理想的 - 但是我无法从主要调用的任意函数访问它.我一开始以为我可以使用旧的回溯方法:追踪保存的帧指针值,直到保存的值为0 - 然后,下一个可以算作最高实际值.(这与获取argv的地址不同,但它会 - 比如说,找出_start或任何_start调用的堆栈指针值[例如__libc_start_main].)现在,我不知道如何获得64位代码中的等效地址.

谢谢.

c stack x86-64 backtrace calling-convention

13
推荐指数
1
解决办法
7376
查看次数

堆栈跟踪和反向跟踪之间有什么区别?

我真的虽然在网上找到答案,但我不能.有什么不同吗?人们说在抛出异常时会产生"回溯",而堆栈跟踪则是从应用程序启动时到抛出异常的点的方法调用列表.如果我们将堆栈跟踪视为数组,则最后一个元素将是抛出异常的方法.回溯的情况是否相反?例如,在像Ruby这样的编程语言中,如果我们有:

begin
  raise 1
rescue
  p $!.backtrace ; p caller(0) #=> displays the back-trace, then the stack-trace
end
Run Code Online (Sandbox Code Playgroud)

他们将输出2个不同的阵列,这对我来说,他们有一些根本不同的东西.

ruby stack-trace backtrace

12
推荐指数
1
解决办法
4166
查看次数

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

如果我的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
查看次数