最近在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;
}
}