Как обработать сигнал SIGSEGV в пользовательском пространстве, используя Rust? - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь понять обработчик переполнения стека в Rust. Я написал функцию recursive_stack(), которая снова и снова объявляет некоторые локальные переменные для исчерпания стекового пространства.

extern crate nix;

use nix::sys::signal;

extern "C" fn handle_sigsegv(_: i32) {
    //Do something here
}

fn main() {
    let sig_action = signal::SigAction::new(
        signal::SigHandler::Handler(handle_sigsegv),
        signal::SaFlags::SA_NODEFER,
        signal::SigSet::empty(),
    );
    unsafe {
        signal::sigaction(signal::SIGSEGV, &sig_action);
    }
    println!("Before function");
    recursive_stack();
    println!("After function");
}

fn recursive_stack() {
    let _array: [i64; 50] = [0; 50];
    recursive_stack();
}

Я хочу поймать сигнал и выполнить мой обработчик сигнала. Если я регистрирую свой обработчик сигнала, я получаю сообщение «Ошибка сегментации (ядро сброшено)». Если я не регистрирую обработчик сигнала, то получаю сообщение о переполнении стека.

Этот обработчик сигналов работает нормально, если я регистрирую его для сигнала SIGINT, но выдает странные результаты для SIGSEGV. Чего мне не хватает?

Я запускаю эту программу в Ubuntu 18.04.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...