osmith submitted this change.
testenv: qemu: get coredump and show backtrace
If the SUT crashes inside QEMU, copy the coredump via 9p to the outer
system (either host or podman) where we have the same binaries and also
debug symbols, and run gdb there to show the backtrace.
Related: OS#6600
Change-Id: Ia08ac58c43388b5ea4d3712c5ef83f54b538b10a
---
M _testenv/data/scripts/qemu/qemu_functions.sh
M _testenv/data/scripts/qemu/qemu_init.sh
2 files changed, 21 insertions(+), 0 deletions(-)
diff --git a/_testenv/data/scripts/qemu/qemu_functions.sh b/_testenv/data/scripts/qemu/qemu_functions.sh
index c0dd8cc..e2014a1 100755
--- a/_testenv/data/scripts/qemu/qemu_functions.sh
+++ b/_testenv/data/scripts/qemu/qemu_functions.sh
@@ -1,5 +1,6 @@
#!/bin/sh -ex
INITRD_DIR="$PWD/_initrd"
+CORE_DIR="$PWD/_coredump"
# Add one or more files to the initramfs, with parent directories.
# usr-merge: resolve symlinks for /lib -> /usr/lib etc. so "cp --parents" does
@@ -171,6 +172,8 @@
machine_arg="-machine pc"
fi
+ mkdir -p "$CORE_DIR"
+
# sudo is required to set up networking in qemu_ifup.sh
# </dev/null to deatch stdin, so qemu doesn't capture ^C
sudo sh -c "
@@ -186,6 +189,13 @@
-serial stdio \
-netdev 'tap,id=nettest,script=$TESTENV_QEMU_SCRIPTS/qemu_ifup.sh' \
-device 'virtio-net-pci,netdev=nettest,mac=$(qemu_random_mac)' \
+ -virtfs 'local,path=$CORE_DIR,mount_tag=coredir,security_model=passthrough,fmode=666,writeout=immediate' \
</dev/null
"
+
+ # Show coredump backtrace
+ if [ -e "$CORE_DIR/coredump" ]; then
+ execfn="$(file "$CORE_DIR/coredump" | grep -o "execfn: '.*'" | cut -d "'" -f 2)"
+ gdb --batch "$execfn" "$CORE_DIR/coredump" -ex bt
+ fi
}
diff --git a/_testenv/data/scripts/qemu/qemu_init.sh b/_testenv/data/scripts/qemu/qemu_init.sh
index 1c8b39b..1c100f8 100755
--- a/_testenv/data/scripts/qemu/qemu_init.sh
+++ b/_testenv/data/scripts/qemu/qemu_init.sh
@@ -1,6 +1,7 @@
#!/bin/busybox sh
echo "Running initrd-init.sh"
set -ex
+COREDUMP=/tmp/coredump
export HOME=/root
export LD_LIBRARY_PATH=/usr/local/lib
@@ -27,10 +28,20 @@
ip link set lo up
ip link set eth0 up
+sysctl -w kernel.core_pattern="$COREDUMP"
+ulimit -c unlimited
+
echo "KERNEL_TEST_VM_IS_READY"
# Use '|| true' to avoid "attempting to kill init" kernel panic on failure
/cmd.sh || true
+if [ -e "$COREDUMP" ]; then
+ mkdir -p /mnt/coredir
+ mount -t 9p -o trans=virtio coredir /mnt/coredir -oversion=9p2000.L
+ chmod 666 "$COREDUMP"
+ cp "$COREDUMP" /mnt/coredir
+fi
+
# Avoid kernel panic when init exits
poweroff -f
To view, visit change 38503. To unsubscribe, or for help writing mail filters, visit settings.