Use /proc/self/comm when argv[0] is not available
When libvmclient determins the name of the calling process, it used
argv[0]. However, it may not work if the caling process is an Android
app, in which case /proc/self/comm works.
Bug: 425014115
Test: atest MicrodroidTestApp:com.android.microdroid.test.MicrodroidTests#vm_virtmgrCrash
Flag: EXEMPT debug-only change
Change-Id: I4500e90e7ab697cf799b43394d163e34431192a0
diff --git a/libs/libvmclient/src/lib.rs b/libs/libvmclient/src/lib.rs
index 91dbe2e..f2feda3 100644
--- a/libs/libvmclient/src/lib.rs
+++ b/libs/libvmclient/src/lib.rs
@@ -145,14 +145,20 @@
command.arg("--ready-fd").arg(format!("{}", ready_fd.as_raw_fd()));
command.preserved_fds(vec![server_fd, ready_fd]);
- // ps uses -o NAME by default, which shows the last path element of argv[0].
- if let Some(arg0) = std::env::args().nth(0) {
- let prog_name = match arg0.rfind('/') {
+ // Determine the name of this process in many ways. Try arg[0], COMM, and PID in that
+ // order.
+ let prog_name = if let Some(arg0) = std::env::args().nth(0) {
+ match arg0.rfind('/') {
Some(idx) => &arg0[idx + 1..],
None => &arg0,
- };
- command.arg0(format!("virtmgr_{prog_name}"));
- }
+ }
+ .to_owned()
+ } else if let Ok(comm) = std::fs::read_to_string("/proc/self/comm") {
+ comm.trim().to_string()
+ } else {
+ std::process::id().to_string()
+ };
+ command.arg0(format!("virtmgr_{prog_name}"));
let process = SharedChild::spawn(&mut command)?;
let is_tty = isatty(std::io::stdout().as_raw_fd())?;
diff --git a/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java b/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java
index 4f781a2..7a334a6 100644
--- a/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java
+++ b/tests/testapk/src/java/com/android/microdroid/test/MicrodroidTests.java
@@ -610,7 +610,7 @@
@Test
public void vm_virtmgrCrash() throws Exception {
- testCrashInternal("test_vm_virtmgrCrash", "virtmgr");
+ testCrashInternal("test_vm_virtmgrCrash", "virtmgr_microdroid.test");
}
@Test