
https://os.phil-opp.com/freestanding-rust-binary/
unwinding과 abort 는 러스트가 프로그램 실행 중 패닉이 발생했을 때 어떻게 처리할지를 정하는 두 가지 방식인데, 여기서는 abort로 처리하고 넘어간다.
[profile.dev]
panic = "abort"
[profile.release]
panic = "abort"
패닉이 발생하면 러스트는 스택을 되감기(unwind)한다. 즉, 현재 함수에서 위쪽으로 호출 스택을 따라 올라가며, 그 안에 살아 있는 지역 변수들을 소멸자 호출을 통해 하나씩 정리한다.
fn main() {
let file = File::open("data.txt").unwrap(); // 패닉 발생
}
만약 여기서 패닉이 나면, file 변수가 해제되면서 파일 핸들도 닫히게 된다.
unwind는 자원이 안전하게 회수된다는 장점이 있지만 동작이 복잡하고 언와인딩 심볼/메타데이터를 추가로 넣어야 해서 바이너리 크기가 커진다. 그리고 특정 환경(OS 없는 bare metal 등)에서는 지원하기 어렵다.
패닉이 발생하면 그냥 프로세스를 즉시 종료(abort) 한다. 따라서 스택을 되감지 않고, 변수 소멸자 호출도 하지 않는다.
이는 unwinding 방식보다 훨씬 단순하고 바이너리 크기도 줄어듦에 따라 OS 없는 환경, 임베디드, OS 개발 등의 환경에 적합하다.
단점으로는 정리 없이 그냥 죽어버리기 때문에 자원 해제가 보장되지 않고, 따라서 파일이나 메모리 등을 직접 회수해야한다는 것이다.
또한 unwinding 모드에서 가능한 catch_unwind와 같은 복구 기능을 쓸 수 없다.
use std::panic;
fn main() {
let result = panic::catch_unwind(|| {
panic!("여기서 패닉 발생!");
});
if result.is_err() {
println!("패닉을 잡았다! 프로그램을 계속 실행한다.");
}
println!("여전히 실행 중!");
}