osmith has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/38503?usp=email )
Change subject: testenv: qemu: get coredump and show backtrace ......................................................................
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(-)
Approvals: Jenkins Builder: Verified pespin: Looks good to me, but someone else must approve fixeria: Looks good to me, approved
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