microdroid_manager: print more info when payload fails via signal
Before
Failed to get exit_code from the paylaod.
After
Payload exited due to signal: 6 (SIGABRT)
Test: atest com.android.microdroid.test.MicrodroidHostTests
Change-Id: Ia9fdd033f8bd3204c7b2d469eeb27bbc20c31a73
diff --git a/microdroid_manager/src/main.rs b/microdroid_manager/src/main.rs
index 73c36aa..8572a0d 100644
--- a/microdroid_manager/src/main.rs
+++ b/microdroid_manager/src/main.rs
@@ -39,6 +39,7 @@
use log::{error, info};
use microdroid_metadata::{write_metadata, Metadata, PayloadMetadata};
use microdroid_payload_config::{OsConfig, Task, TaskType, VmPayloadConfig};
+use nix::sys::signal::Signal;
use openssl::sha::Sha512;
use payload::{get_apex_data_from_payload, load_metadata, to_metadata};
use rand::Fill;
@@ -50,6 +51,7 @@
use std::fs::{self, create_dir, File, OpenOptions};
use std::io::Write;
use std::os::unix::io::{FromRawFd, IntoRawFd};
+use std::os::unix::process::ExitStatusExt;
use std::path::Path;
use std::process::{Child, Command, Stdio};
use std::str;
@@ -731,7 +733,17 @@
service.notifyPayloadStarted()?;
let exit_status = command.spawn()?.wait()?;
- exit_status.code().ok_or_else(|| anyhow!("Failed to get exit_code from the paylaod."))
+ match exit_status.code() {
+ Some(exit_code) => Ok(exit_code),
+ None => Err(match exit_status.signal() {
+ Some(signal) => anyhow!(
+ "Payload exited due to signal: {} ({})",
+ signal,
+ Signal::try_from(signal).map_or("unknown", |s| s.as_str())
+ ),
+ None => anyhow!("Payload has neither exit code nor signal"),
+ }),
+ }
}
fn build_command(task: &Task) -> Result<Command> {