添加信号处理函数debug程序异常退出

最近在debug rust写的程序异常退出问题,没有任何log。猜测可能是被kill掉。通过手动添加signal handle来尝试打印出出错信息发现了问题所在。

signal处理的几种现有的工具,主流的signal_hook感觉有点复杂,不太适合我的需求。我希望得到一个类似于c中sigaction的东西。rust也是提供了的。参考了这个是示例:https://gist.github.com/takaswie/ded48047759dd25fe4c9308583fa074ds

这个例子中,你首先要知道给哪个signal安装handle。为此我找到了另外一个工具,可以简单的获取信号类型。

use simple_signal::{self, Signal};
simple_signal::set_handler(&[Signal::Int, Signal::Term], |signals| println!("Caught: {:?}", signals));

 一旦我们得到信号类型,我们就可以据此安装相应的handler。

extern "C" fn handle(sig: libc::c_int, info: *mut libc::siginfo_t,
                     _: *mut libc::c_void) {
    println!("caugh signal {}", sig);
    unsafe {
        println!("address: {:?} caugh error", (*info).si_addr());
    }
    std::process::exit(1);
}

fn install_signal_handler() {
    unsafe {
        let sig_action = signal::SigAction::new(
                                    signal::SigHandler::SigAction(handle),
                                    signal::SaFlags::empty(),
                                    signal::SigSet::empty());
        signal::sigaction(signal::SIGSEGV, &sig_action)
    };
}

//test to get a segment fault signal
fn main() {
    unsafe {
        let p = 0x10000;
        let point = p as *const i32;
        let v = *point;
    }
}