如何检测从 Rust 生成的命令是否导致分段错误?
How to detect if a command spawed from Rust resulted in Segmentation Fault?
我正在构建一个包装器来测试一个偶尔会导致分段错误的应用程序。
use std::io::{Write};
use std::process::{Command, Stdio};
fn main() {
let input_name = "Saqib Ali";
let input_email = "saqib@test.com"
let input_serial_numer = "SN103213112"
let register_app = Command::new("register_drive").stdin(Stdio::piped()).spawn().unwrap();
write!(register_app.stdin.unwrap(), "{}", input_name).unwrap();
}
当 input_name
发送给程序时,如何检测程序是否导致了分段错误?
您可以等待该过程完成并使用 Unix-specific ExitStatusExt
特征从退出状态中提取信号代码,并使用 libc
板条箱将信号标识为SIGSEGV
:
use std::os::unix::process::ExitStatusExt;
let input_name = "Saqib Ali";
let mut register_app = Command::new("register_drive")
.stdin(Stdio::piped())
.spawn()
.unwrap();
write!(register_app.stdin.as_mut().unwrap(), "{}", input_name).unwrap();
let status = register_app.wait().unwrap();
match status.signal() {
Some(signal) if signal == libc::SIGSEGV => {
println!("the process resulted in segmentation fault");
}
_ => println!("the process resulted in {:?}", status),
}
请注意,您可能希望使用 writeln!()
写入程序的标准输入,否则具有输入名称的行将不会终止并可能与后续输入合并。
我正在构建一个包装器来测试一个偶尔会导致分段错误的应用程序。
use std::io::{Write};
use std::process::{Command, Stdio};
fn main() {
let input_name = "Saqib Ali";
let input_email = "saqib@test.com"
let input_serial_numer = "SN103213112"
let register_app = Command::new("register_drive").stdin(Stdio::piped()).spawn().unwrap();
write!(register_app.stdin.unwrap(), "{}", input_name).unwrap();
}
当 input_name
发送给程序时,如何检测程序是否导致了分段错误?
您可以等待该过程完成并使用 Unix-specific ExitStatusExt
特征从退出状态中提取信号代码,并使用 libc
板条箱将信号标识为SIGSEGV
:
use std::os::unix::process::ExitStatusExt;
let input_name = "Saqib Ali";
let mut register_app = Command::new("register_drive")
.stdin(Stdio::piped())
.spawn()
.unwrap();
write!(register_app.stdin.as_mut().unwrap(), "{}", input_name).unwrap();
let status = register_app.wait().unwrap();
match status.signal() {
Some(signal) if signal == libc::SIGSEGV => {
println!("the process resulted in segmentation fault");
}
_ => println!("the process resulted in {:?}", status),
}
请注意,您可能希望使用 writeln!()
写入程序的标准输入,否则具有输入名称的行将不会终止并可能与后续输入合并。