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 (5 years, 5 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:

https://wiki.netbsd.org/kernel_debugging_with_qemu/ 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.

https://wiki.netbsd.org/netbsd_kernel_development_setup/, 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
    2: 
    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.
    5: 
    6: ## Prerequisites
    7: 
    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.
   13: 
   14: If your host system is running NetBSD, install the following packages
   15: from pkgsrc:
   16: 
   17: * emulators/qemu >= 2.0.0nb4
   18: * misc/py-anita
   19: 
   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: <http://www.gson.org/netbsd/anita/download/>.
   25: 
   26: ## Building the target system
   27: 
   28: Check out the NetBSD-current sources from CVS and build a full
   29: NetBSD-current/i386 release with debug symbols using the build.sh
   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|http://gnats.NetBSD.org/49276]], and sparc by
   33: [[qemu bug 1335444|https://bugs.launchpad.net/qemu/+bug/1335444]].
   34: 
   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:
   39: 
   40: [[!template  id=programlisting text="""
   41:  $ CVSROOT=anoncvs@anoncvs.NetBSD.org:/cvsroot cvs checkout -A -P src
   42:  $ cd src
   43:  $ ./build.sh -j 4 -V MKDEBUG=YES -V COPTS="-g -fdebug-prefix-map=$(pwd)=/usr/src" -O ../obj -m i386 -U release sourcesets
   44: """]]
   45: 
   46: For best performance, change the number after "-j" to the number of CPU cores
   47: you have, or slightly more.
   48: 
   49: ## Installing the target system
   50: 
   51: Install the system in a virtual machine, including the debug symbols and source code:
   52: 
   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: """]]
   59: 
   60: ## Booting the VMs
   61: 
   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").
   64: 
   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.
   70: 
   71: First start the kgdb target, enabling qemu's built-in GDB target stub
   72: on TCP port 1234:
   73: 
   74: [[!template  id=programlisting text="""
   75:  $ qemu-system-i386 -nographic -snapshot -hda work/wd0.img -gdb tcp::1234
   76: """]]
   77: 
   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.
   81: 
   82: In a second terminal window, start the kgdb host:
   83: 
   84: [[!template  id=programlisting text="""
   85:  $ qemu-system-i386 -nographic -snapshot -hda work/wd0.img
   86: """]]
   87: 
   88: Log in to the kgdb host as root and set up the network:
   89: 
   90: [[!template  id=programlisting text="""
   91:  login: root
   92:  # dhcpcd
   93: """]]
   94: 
   95: Start gdb on the kgdb host and connect to the target:
   96: 
   97: [[!template  id=programlisting text="""
   98:  # gdb /netbsd
   99:  (gdb) target remote my.host.name:1234
  100: """]]
  101: 
  102: where my.host.name is the domain name or IP address of the
  103: physical machine running the kgdb target qemu VM.
  104: 
  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:
  107: 
  108: [[!template  id=programlisting text="""
  109:  (gdb) where
  110:  (gdb) list
  111: """]]
  112: 
  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.
  118: 
  119: ## Qemu tips
  120: 
  121: Here is a couple of useful qemu commands to know:
  122: 
  123: * Ctrl-a b will send a break which will make the NetBSD VM enter the ddb kernel debugger.
  124: 
  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 <wikimaster@NetBSD.org> software: FreeBSD-CVSweb