Debugging guest kernels with gdb

Note: this feature is only available on android14-5.15 and newer host kernels.

Starting with Android U it is possible to attach a gdb to the guest kernel, when starting a debuggable and non-protected guest VM.

You can do this by passing --gdb <port> argument to the vm run, vm run-app and vm run-microdroid commands. The crosvm will start the gdb server on the provided port. It will wait for the gdb client to connect to it before proceeding with the VM boot.

Here is an example invocation:

adb forward tcp:3456 tcp:3456
adb shell /apex/com.android.virt/bin/vm run-microdroid --gdb 3456

Then in another shell:

gdb vmlinux
(gdb) target remote :3456
(gdb) hbreak start_kernel
(gdb) c

The kernel documentation has some general techniques on how to debug kernel with gdb.

Obtaining vmlinux for Microdroid kernels

If you are debugging Microdroid kernel that you have built locally, then look for out/dist/vmlinux in your kernel repository.

If you are debugging Microdroid kernel bundled with the com.android.virt APEX, then you need to obtain the build ID of this kernel. You can do this by checking the prebuilt-info.txt file in the packages/modules/Virtualization/build/microdroid/kernel/arm64 or packages/modules/Virtualization/build/microdroid/kernel/x86_64 directories.

Using that build ID you can download the vmlinux from the build server via: https://ci.android.com/builds/submitted/${BUILD_ID}/kernel_microdroid_aarch64/latest/vmlinux