From 710e42e80fe80a9af197bd2fe0e7029dec00d960 Mon Sep 17 00:00:00 2001 From: Ciro Santilli Date: Sun, 21 May 2017 09:26:47 +0100 Subject: [PATCH] qemu on background for debug --- README.md | 36 ++++++++++++++++++++++++------------ rungdb | 2 +- runqemu | 20 ++++++++++++++++++-- 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 30c5103..5cba3e4 100644 --- a/README.md +++ b/README.md @@ -44,13 +44,31 @@ We use `printk` a lot, and it shows on the QEMU terminal by default. If that ann See also: +## Text mode + +Show serial output of QEMU directly on the current terminal, without opening a QEMU window: + + ./run -n + +To exit, just do a regular: + + poweroff + +This is particularly useful to get full panic traces when you start making the kernel crashing :-) + +In case of a panic, you want your terminal back with `Ctrl + C, A` and type `quit`. See also: + +See also: + ## Debugging To GDB the Linux kernel, first run: ./runqemu -d -If you want to break immediately at a symbol, e.g. `start_kernel` of the boot sequence, open another terminal and run: +This starts QEMU on the background of the shell, to prepare for running GDB. + +If you want to break immediately at a symbol, e.g. `start_kernel` of the boot sequence, run: ./rungdb start_kernel @@ -83,21 +101,15 @@ And now you can control the counting from GDB: See also: -## Text mode +If you are using text mode: -Show serial output of QEMU directly on the current terminal, without opening a QEMU window: + ./runqemu -d -n - ./run -n +QEMU cannot be put on the background of the current shell, so you will need to open a separate terminal and run: -To exit, just do a regular: + ./rungdb - poweroff - -This is particularly useful to get full panic traces when you start making the kernel crashing :-) - -In case of a panic, you want your terminal back with `Ctrl + C, A` and type `quit`. See also: - -See also: +manually. ## Table of contents diff --git a/rungdb b/rungdb index 5f159b5..763e4e6 100755 --- a/rungdb +++ b/rungdb @@ -6,6 +6,7 @@ else fi cd buildroot/output/build/linux-*.*.*/ cmd="gdb \ + -q \ -ex 'add-auto-load-safe-path $(pwd)' \ -ex 'file vmlinux' \ -ex 'set arch i386:x86-64:intel' \ @@ -16,5 +17,4 @@ cmd="gdb \ -ex 'set arch i386:x86-64' \ -ex 'target remote localhost:1234' " -echo "$cmd" eval "$cmd" diff --git a/runqemu b/runqemu index 0cbb7d0..9afdd44 100755 --- a/runqemu +++ b/runqemu @@ -3,23 +3,27 @@ set -e # CLI handling. +debug=false +nographic=false extra_append='' extra_flags='' while getopts dn OPT; do case "$OPT" in d) + debug=true extra_flags="$extra_flags -S -s" ;; n) extra_append="$extra_append console=ttyS0" extra_flags="$extra_flags -nographic" + nographic=true ;; esac done -qemu-system-x86_64 \ +cmd="qemu-system-x86_64 \ -M pc \ - -append "root=/dev/vda $extra_append" \ + -append 'root=/dev/vda $extra_append' \ -drive file=buildroot/output/images/rootfs.ext2,if=virtio,format=raw \ -kernel buildroot/output/images/bzImage \ -m 128M \ @@ -28,3 +32,15 @@ qemu-system-x86_64 \ -smp 1 \ $extra_flags \ ; +" + +if $debug && ! $nographic; then + eval nohup "$cmd" &>/dev/null & + # TODO: Ctrl +C gets sent to QEMU? Why? Does not happen if I run + # ./rungdb manually from outside this script!!! But why?!?! + # eval has nothing to do with it, minimized example with explicit + # commands also fails in the same way... + #./rungdb +else + eval "$cmd" +fi