我需要从C++程序中获取addr2line提供的信息(来自回溯函数调用的文件和行).是否有类似于addr2line的库调用?
编辑:我在Linux环境中工作.
我知道我可以直接调用addr2line,我知道我可以在我的程序中使用addr2line 的源代码(也是GPL许可).但我想调用库函数(如果存在)更清晰.
编辑:我将使用binutils的bfd,就像addr2line一样.无论如何,bfd意味着什么?
当我的规格出现错误时,我收到如下消息:
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
如何关闭扩展跟踪?
在Linux中,要获得回溯,您可以使用backtrace()库调用,但它只返回当前线程的回溯.有没有办法得到一些其他线程的回溯,假设我知道它的TID(或pthread_t),我可以保证它睡觉?
似乎libunwind(http://www.nongnu.org/libunwind/)项目可以提供帮助.问题是CentOS不支持它,所以我不想使用它.
还有其他想法吗?谢谢.
来自: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.
我正在使用backtrace从抛出异常的位置获取信息.在我的异常的构造函数中,我将回溯存储在std :: string中,并且在catch块中为此类型的异常存储,我正在打印此回溯.
但我想知道,是否有可能以某种方式在catch块中为其他异常类型获得相同的回溯?
我试图理解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位代码中的等效地址.
谢谢.
我真的虽然在网上找到答案,但我不能.有什么不同吗?人们说在抛出异常时会产生"回溯",而堆栈跟踪则是从应用程序启动时到抛出异常的点的方法调用列表.如果我们将堆栈跟踪视为数组,则最后一个元素将是抛出异常的方法.回溯的情况是否相反?例如,在像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个不同的阵列,这对我来说,他们有一些根本不同的东西.
如果我的C++应用程序在Windows上崩溃,我想向我们的服务器发送有用的调试信息.
在Linux上我会使用GNU backtrace()函数 - 是否有Windows的等价物?
有没有办法在程序崩溃后提取有用的调试信息?或者只是从过程中?
(根据"测试你的应用程序,所以它不会崩溃"的建议是没有用的! - 所有非平凡的程序都会有bug)
当我的c ++ linux应用程序崩溃时,我需要转储堆栈跟踪.我使用backtrace()和backtrace_symbols()成功地做到了这一点.现在,另外我想得到崩溃的行号.它是怎么做到的?
我正在写一个C++11软件而且我正在使用lambdas.当我打印回溯时,backtrace_symbols_fd除了lambda之外,所有函数都被解除了.这有点显而易见,因为它们是匿名函数,但有一种方法可以获得更多的洞察力而不是原始指针?
我在Linux上使用GCC 4.8