标签: backtrace

GDB:关于回溯中文件的相对和绝对路径的问题

我有关于gdb或gcc的问题(但不是firefox).

我在调试firefox时只看到gdb中的绝对路径.例:

5  0x01bb0c52 in nsAppShell::ProcessNextNativeEvent 
    (this=0xb7232ba0, mayWait=1)
    at 
    /media/25b7639d-9a70-42ca-aaa7-28f4d1f417fd/firefox-dev/mozilla-central/widget/src/gtk2/nsAppShell.cpp:144
Run Code Online (Sandbox Code Playgroud)

阅读这样的回溯是不舒服的.如果我尝试编译和调试微小的测试程序,我会看到这样的回溯(与文件的相对路径):

0  main () at prog.c:5
Run Code Online (Sandbox Code Playgroud)

在调试firefox时,我怎么能看到回溯中的相对路径?

PS gcc 4.4.1; gdb 7.0.

gcc gdb path backtrace

7
推荐指数
1
解决办法
2365
查看次数

如果我知道带有gdb的类型,我怎么能看到boost :: any的值

我有一个核心转储,我正在使用gdb查看核心转储.

我想知道是否有办法能够检查gdb中boost :: any值的值?

在核心,我有地址提升任何,所以我尝试将其转换为占位符,看看我是否可以检查价值,但我做不到.我知道boost的类型是unsigned long,所以有没有办法查看知道类型的任何值?

(gdb) print ('boost::any::placeholder')(*(('boost::any'*)0x00007f263fa27730).content)
warning: can't find linker symbol for virtual table for `boost::any::placeholder' value
warning:   found `boost::any::holder<bool>::~holder()' instead
$129 = warning: can't find linker symbol for virtual table for `boost::any::placeholder' value
warning:   found `boost::any::holder<bool>::~holder()' instead
warning: can't find linker symbol for virtual table for `boost::any::placeholder' value
warning:   found `boost::any::holder<bool>::~holder()' instead
{
  _vptr.placeholder = 0x7f2a9a662560
}
Run Code Online (Sandbox Code Playgroud)

任何有关此事的帮助将不胜感激.谢谢!

c++ boost gdb backtrace boost-any

7
推荐指数
1
解决办法
738
查看次数

Android _Unwind_Backtrace里面的sigaction

我试图在我的Android NDK应用程序中捕获SIGSEGV等信号以进行调试.为此,我设置了一个名为的sigaction.

我现在正试图获得通话的堆栈.问题是_Unwind_Backtrace只能在当前堆栈和sigaction上运行它自己的堆栈.

那么,有没有办法获得接收信号的执行指针的堆栈?(基本上告诉_Unwind_Backtrace放松另一个堆栈而不是当前?)

我应该指出:

  • 使用backtrace()backtrace_symbols()不是选项,因为这些功能未在Android NDK中提供

  • 我正在使用GDB来调查本地设备上的崩溃.我不想替换GDB,我希望能够在向他发送测试版本时从客户端接收有意义的堆栈跟踪.

编辑:使用Android的libcorkscrew从系统/核心所建议的法登,但是当我使用它的unwind_backtrace_signal_arch功能,我得到一个奇怪的回溯不代表死机我都试过了.

android signals stack-trace backtrace android-ndk

7
推荐指数
1
解决办法
3890
查看次数

Rails回溯消音器不起作用,而过滤器则不起作用

Fresh Rails 4.2设置.我想抑制长错误回溯.在下面的回溯日志中,第一行对我来说已经足够了,接下来的4行可以删除

ActionController::RoutingError (No route matches [GET] "/user"):
  actionpack (4.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  web-console (2.1.2) lib/web_console/middleware.rb:37:in `call'
  actionpack (4.2.1) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.2.1) lib/rails/rack/logger.rb:38:in `call_app'
Run Code Online (Sandbox Code Playgroud)

我添加了一个新的消音器 backtrace_silencers.rb

# config/initializers/backtrace_silencers.rb
Rails.backtrace_cleaner.add_silencer { |line| line =~ /lib/ }
Run Code Online (Sandbox Code Playgroud)

服务器重启后 - 没有任何反应,我仍然得到相同的回溯日志.(/lib/应该删除每一行匹配:http://api.rubyonrails.org/classes/ActiveSupport/BacktraceCleaner.htm)

完整性检查:

> line = "actionpack (4.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'"
=> "actionpack (4.2.1) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'"
> line =~ /lib/
=> 19
Run Code Online (Sandbox Code Playgroud)

但过滤器工作:

# config/initializers/backtrace_silencers.rb
Rails.backtrace_cleaner.add_filter { |line| line.gsub('lib', 'yeah!') }
Run Code Online (Sandbox Code Playgroud)

现在回溯看起来像这样:

ActionController::RoutingError (No route matches [GET] "/user"): …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails backtrace ruby-on-rails-4

7
推荐指数
2
解决办法
1556
查看次数

运行安装在 Debian 中的 Rust 二进制文件时如何传递 RUST_BACKTRACE=1?

当我使用货物运行二进制文件时,我可以选择按如下方式运行它 -

bash -c "RUST_BACKTRACE=1 cargo run --bin my_binary"
Run Code Online (Sandbox Code Playgroud)

当二进制文件出错时,这给了我一个堆栈跟踪。但是当我为同一个二进制文件创建一个 Debian 包时,我如何在失败时获得堆栈跟踪?

如果源代码是在 Rust 中实现的,是否也有某种方法可以在那里启用回溯?

编辑:

我使用以下命令为我的货物项目创建了一个 debian 包

cargo deb // Produces a my_binary.deb
Run Code Online (Sandbox Code Playgroud)

这个 my_binary.deb 然后可以安装在 Debian 机器上作为 -

 dpkg -i /tmp/my_binary*.deb || true \
 && apt-get -f -y install
Run Code Online (Sandbox Code Playgroud)

debian environment-variables backtrace rust rust-cargo

7
推荐指数
2
解决办法
8042
查看次数

从 Rust 钩子中的恐慌中检索回溯?

我的应用程序需要通过标准输出将日志以 JSON 格式发送到 fluentd。
当我试图处理恐慌并将 a&std::panic::PanicInfo作为 JSON安排时std::panic::set_hook,我找不到从 a 中检索回溯的方法&PanicInfo

有没有办法从自定义钩子中的恐慌中检索回溯?

logging backtrace panic rust

7
推荐指数
2
解决办法
2291
查看次数

GDB bt错误:“没有足够的寄存器或内存可用于进一步展开”

由于以下原因,来自核心文件的回溯信息剪切了有用的信息:

Backtrace已停止:没有足够的寄存器或内存可用于进一步展开。

为什么会出现此消息,我可以对此做些什么?

c++ gdb backtrace debug-backtrace

6
推荐指数
1
解决办法
2965
查看次数

分析由于库有错误而发生的崩溃的回溯

在我的应用程序中,我有设置信号处理程序来捕获Segfaults,并打印bactraces.进程启动时,我的应用程序会加载一些插件库.

如果我的应用程序崩溃了一个段错误,由于主可执行二进制文件中的错误,我可以用以下内容分析回溯:

addr2line -Cif -e ./myapplication 0x4...
Run Code Online (Sandbox Code Playgroud)

它准确地显示了函数和source_file:line_no

但是,如何分析是否由于插件中的错误而发生崩溃,如下面的回溯?

/opt/myapplication(_Z7sigsegvv+0x15)[0x504245]
/lib64/libpthread.so.0[0x3f1c40f500]
/opt/myapplication/modules/myplugin.so(_ZN11ICAPSection7processEP12CONNECTION_TP7Filebufi+0x6af)[0x7f5588fe4bbf]
/opt/myapplication/modules/myplugin.so(_Z11myplugin_reqmodP12CONNECTION_TP7Filebuf+0x68)[0x7f5588fe51e8]
/opt/myapplication(_ZN10Processors7ExecuteEiP12CONNECTION_TP7Filebuf+0x5b)[0x4e584b]
/opt/myapplication(_Z15process_requestP12CONNECTION_TP7Filebuf+0x462)[0x4efa92]
/opt/myapplication(_Z14handle_requestP12CONNECTION_T+0x1c6d)[0x4d4ded]
/opt/myapplication(_Z13process_entryP12CONNECTION_T+0x240)[0x4d79c0]
/lib64/libpthread.so.0[0x3f1c407851]
/lib64/libc.so.6(clone+0x6d)[0x3f1bce890d]
Run Code Online (Sandbox Code Playgroud)

我的应用程序和插件库都使用gcc编译并且未被删除.我的应用程序在执行时,使用dlopen加载plugin.so不幸的是,崩溃发生在我无法在gdb下运行应用程序的站点上.

谷歌疯狂地搜索答案,但所有讨论回溯和addr2line的网站排除了可能需要分析错误插件的情况.我希望一些善良的黑客知道这个困境的解决方案,并且可以分享一些见解.对于其他程序员来说,这将是非常宝贵的.

提前谢谢.

c c++ backtrace debug-backtrace addr2line

6
推荐指数
2
解决办法
2548
查看次数

对于设置传统帧指针的函数,是否有简单的DWARF CFI表示?

我正在编写C,C++和汇编的混合编程,我希望从代码的任何部分获得可靠的回溯.

这主要工作正常的C和C++代码,因为我可以生成调试与信息-g,这对于现代的x86编译器和平台生成DWARF调试信息,这意味着最终的二进制包括CFI(调用帧信息).此信息允许通过当前调用堆栈中的函数向后移动.它可以支持复杂的场景,例如没有基指针的函数以及rsp动态方式的变化.对于C和C++代码,我不必关心:即使对于优化的代码,编译器也会生成正确的CFI.

对于我在nasm中编写的x86汇编代码,CFI是个问题.nasm和语法兼容的竞争对手yasm对生成DWARF信息有一些有限的支持,但它主要涉及指向行映射的指令指针,并且不包括任何CFI 1(实际上,即使它集合也无法真正生成它因为程序集太低而无法明确表达调用/返回语义,所以需要.

我想为程序集生成的例程添加CFI,但我不需要CFI的完全灵活性来根据指令细化更改识别CFA rsp等等:我非常乐意设置标准框架-pointer in rbpfor each assembly function并保持整个函数的完整性.DWARF3是否通过一小段CFI信息支持这种情况,希望我能用汇编器宏生成一个?


1 yasm 的实验性"nextgen" 版本确实支持CFI指令,但该项目尚未在5年内更新.有一个未解决的问题是将此支持移回yasm的主线版本.

debugging x86 nasm backtrace dwarf

6
推荐指数
0
解决办法
209
查看次数

在 catch_unwind 期间将回溯转换为字符串

我正在用 Rust 编写一个跨平台(Linux/iOS/Android)库。万一我的库发生恐慌,我希望应用程序继续正常工作而不是崩溃。为了做到这一点,我正在使用catch_unwind; 其结果包含恐慌信息,并且不包含有关问题根源的足够信息,这里有一段代码解释了我正在做的事情:

fn calculate(json: &str) -> String {
    unimplemented!()
}

#[no_mangle]
pub fn rust_calculation(json: &str) -> String {
    let r = std::panic::catch_unwind(||{
        // rust calculation
        let calc: String = calculate(json).into();
        calc
    });
    let r_str = match r {
        Ok(v) => v,
        Err(e) => {
            let panic_information = match e.downcast::<String>() {
                Ok(v) => *v,
                _ => "Unknown Source of Error".to_owned()
            };
            panic_information
        }
    };
    return r_str;
}

fn main() {
    println!("{}", rust_calculation("test"));
}
Run Code Online (Sandbox Code Playgroud)

操场

如果发生错误,返回的消息是不够的,有时,它只包含消息

错误来源未知

我想将回溯发送到调用源,以便它可以记录它,然后我们可以调试 …

error-handling backtrace rust

6
推荐指数
1
解决办法
1193
查看次数