我有关于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.
我有一个核心转储,我正在使用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)
任何有关此事的帮助将不胜感激.谢谢!
我试图在我的Android NDK应用程序中捕获SIGSEGV等信号以进行调试.为此,我设置了一个名为的sigaction.
我现在正试图获得通话的堆栈.问题是_Unwind_Backtrace只能在当前堆栈和sigaction上运行它自己的堆栈.
那么,有没有办法获得接收信号的执行指针的堆栈?(基本上告诉_Unwind_Backtrace放松另一个堆栈而不是当前?)
我应该指出:
使用backtrace()和backtrace_symbols()不是选项,因为这些功能未在Android NDK中提供
我正在使用GDB来调查本地设备上的崩溃.我不想替换GDB,我希望能够在向他发送测试版本时从客户端接收有意义的堆栈跟踪.
编辑:使用Android的libcorkscrew从系统/核心所建议的法登,但是当我使用它的unwind_backtrace_signal_arch功能,我得到一个奇怪的回溯不代表死机我都试过了.
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) 当我使用货物运行二进制文件时,我可以选择按如下方式运行它 -
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) 我的应用程序需要通过标准输出将日志以 JSON 格式发送到 fluentd。
当我试图处理恐慌并将 a&std::panic::PanicInfo作为 JSON安排时std::panic::set_hook,我找不到从 a 中检索回溯的方法&PanicInfo。
有没有办法从自定义钩子中的恐慌中检索回溯?
由于以下原因,来自核心文件的回溯信息剪切了有用的信息:
Backtrace已停止:没有足够的寄存器或内存可用于进一步展开。
为什么会出现此消息,我可以对此做些什么?
在我的应用程序中,我有设置信号处理程序来捕获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++和汇编的混合编程,我希望从代码的任何部分获得可靠的回溯.
这主要工作正常的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的主线版本.
我正在用 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)
如果发生错误,返回的消息是不够的,有时,它只包含消息
错误来源未知
我想将回溯发送到调用源,以便它可以记录它,然后我们可以调试 …