File:  [NetBSD Developer Wiki] / wikisrc / kernel_debugging_with_qemu.mdwn
Revision 1.5: download - view: text, annotated - select for diffs
Wed Feb 18 16:00:09 2015 UTC (7 years, 11 months ago) by gson
Branches: MAIN
CVS tags: HEAD
Heavy-handed cleanup of the pages related to kernel debugging with
QEMU.  There are two such pages: didn't actually
contain any instructions for debugging with qemu, despite the name,
only instructions for creating a hard disk image for use qith qemu,
and even those where incomplete., on the other
hand, did contain instructions for debugging with qemu, with two
alternative methods for setting up the disk image, one of which was a
duplicate of the incomplete instructions in kernel_debugging_with_qemu.

I have now updated the qemu debugging instructions to work with recent
versinos of qemu and -current, tested them on both NetBSD and Linux
hosts, and moved them to the kernel_debugging_with_qemu page to make
the page title better match the content.  I also removed the
incomplete disk image creation instructions (from both places).  The
netbsd_kernel_development_setup page is hereby obsoleted and now
contains only a reference to the kernel_debugging_with_qemu page.

    1: # Introduction
    3: This HOWTO explains how to set up a test environment for symbolic
    4: debugging of the NetBSD kernel using a pair of QEMU virtual machines.
    6: ## Prerequisites
    8: You need a computer running an OS capable of cross-building NetBSD
    9: (the "host system").
   10: This can be be NetBSD itself, Linux, or some other Unix-like OS.
   11: These instructions have been tested with NetBSD/amd64 6.1.4 and
   12: Debian 7 hosts.
   14: If your host system is running NetBSD, install the following packages
   15: from pkgsrc:
   17: * emulators/qemu >= 2.0.0nb4
   18: * misc/py-anita
   20: If your host system uses a package system other than pkgsrc,
   21: use that to install cvs, make, gcc, qemu, the Python pexpect
   22: library, and genisoimage or mkisofs.  Also download and 
   23: install the most recent anita package from
   24: <>.
   26: ## Building the target system
   28: Check out the NetBSD-current sources from CVS and build a full
   29: NetBSD-current/i386 release with debug symbols using the
   30: script.  The i386 port is the preferred test platform because the two
   31: other ports supported by anita are affected by known bugs: amd64 by
   32: [[PR 49276|]], and sparc by
   33: [[qemu bug 1335444|]].
   35: If you do the build in a directory other than /usr/src, 
   36: use the -fdebug-prefix-map option to ensure that the source file names embedded
   37: in the debug symbols point to /usr/src, which is where the sources will be
   38: installed on the target system.  For example:
   40: [[!template  id=programlisting text="""
   41:  $ cvs checkout -A -P src
   42:  $ cd src
   43:  $ ./ -j 4 -V MKDEBUG=YES -V COPTS="-g -fdebug-prefix-map=$(pwd)=/usr/src" -O ../obj -m i386 -U release sourcesets
   44: """]]
   46: For best performance, change the number after "-j" to the number of CPU cores
   47: you have, or slightly more.
   49: ## Installing the target system
   51: Install the system in a virtual machine, including the debug symbols and source code:
   53: [[!template  id=programlisting text="""
   54:  $ cd ..
   55:  $ anita --workdir work --disk-size 4G --memory-size 256M \
   56:      --sets kern-GENERIC,modules,base,etc,comp,debug,games,man,misc,tests,text,syssrc,src,sharesrc,gnusrc \
   57:      install $(pwd)/obj/releasedir/i386/
   58: """]]
   60: ## Booting the VMs
   62: Next, start two qemu virtual machines, one to run the kernel being
   63: debugged (the "kgdb target") and another to run gdb (the "kgdb host").
   65: The two VMS could be run on separate physical machines, but in this
   66: example, they are run on the same physical machine and share the same
   67: hard disk image.  This sharing is made possible by the "-snapshot"
   68: option to qemu, which ensures that the disk image is not written to by
   69: either VM.
   71: First start the kgdb target, enabling qemu's built-in GDB target stub
   72: on TCP port 1234:
   74: [[!template  id=programlisting text="""
   75:  $ qemu-system-i386 -nographic -snapshot -hda work/wd0.img -gdb tcp::1234
   76: """]]
   78: If you don't want everyone on the Internet to be able to debug your
   79: target, make sure incoming connections on port 1234 are blocked in
   80: your firewall.
   82: In a second terminal window, start the kgdb host:
   84: [[!template  id=programlisting text="""
   85:  $ qemu-system-i386 -nographic -snapshot -hda work/wd0.img
   86: """]]
   88: Log in to the kgdb host as root and set up the network:
   90: [[!template  id=programlisting text="""
   91:  login: root
   92:  # dhcpcd
   93: """]]
   95: Start gdb on the kgdb host and connect to the target:
   97: [[!template  id=programlisting text="""
   98:  # gdb /netbsd
   99:  (gdb) target remote
  100: """]]
  102: where is the domain name or IP address of the
  103: physical machine running the kgdb target qemu VM.
  105: Now you should be able to get a stack trace and start debugging
  106: with full debug symbols and access to the source code:
  108: [[!template  id=programlisting text="""
  109:  (gdb) where
  110:  (gdb) list
  111: """]]
  113: If the stack trace prints very slowly (like 30 seconds per stack
  114: frame), it's likely because you are using a version of qemu where
  115: the user-mode networking code fails to disable the Nagle algorithm.
  116: This is fixed in the qemu in pkgsrc, but you may run into it if your
  117: qemu is not installed via pkgsrc.
  119: ## Qemu tips
  121: Here is a couple of useful qemu commands to know:
  123: * Ctrl-a b will send a break which will make the NetBSD VM enter the ddb kernel debugger.
  125: * Ctrl-a c will switch to the qemu monitor where you can enter commands like "quit" to exit qemu,
  126: or do things like saving/restoring the VM to/from a file.

CVSweb for NetBSD wikisrc <> software: FreeBSD-CVSweb