File:  [NetBSD Developer Wiki] / wikisrc / kernel_debugging_with_qemu.mdwn
Revision 1.15: download - view: text, annotated - select for diffs
Thu Mar 8 16:57:05 2018 UTC (23 months, 3 weeks ago) by gson
Branches: MAIN
CVS tags: HEAD
Recommend anita 1.44, because 1.42 and 1.43 can't install source sets

    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 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.   There should be at least 20 gigabytes of available
   13: disk space.
   14: 
   15: If your host system is running NetBSD, install the following packages
   16: from pkgsrc:
   17: 
   18: * emulators/qemu >= 2.0.0nb4
   19: * misc/py-anita >= 1.44
   20: 
   21: If your host system uses a package system other than pkgsrc,
   22: use that to install cvs, make, gcc, qemu, the Python pexpect
   23: library, and genisoimage or mkisofs.  Also download and 
   24: install the most recent anita package from
   25: <http://www.gson.org/netbsd/anita/download/>.
   26: 
   27: ## Building the target system
   28: 
   29: Check out the NetBSD-current sources from CVS and build a full release
   30: of NetBSD-current/i386 with debug symbols using the build.sh script.
   31: The i386 port is preferred because these instructions have been 
   32: successfully tested with it.
   33: The amd64 port won't work because of [[PR 50128|http://gnats.NetBSD.org/50128]],
   34: and sparc has not been tested since [[qemu bug
   35: 1399943|https://bugs.launchpad.net/qemu/+bug/1399943]] was fixed.
   36: 
   37: If you do the build in a directory other than /usr/src, 
   38: use the -fdebug-prefix-map option to ensure that the source file names embedded
   39: in the debug symbols point to /usr/src, which is where the sources will be
   40: installed on the target system.  For example:
   41: 
   42: [[!template  id=programlisting text="""
   43:  $ CVSROOT=anoncvs@anoncvs.NetBSD.org:/cvsroot cvs checkout -A -P src
   44:  $ cd src
   45:  $ ./build.sh -j 4 -V MKDEBUG=YES -V COPTS="-g -fdebug-prefix-map=$(pwd)=/usr/src" -O ../obj -m i386 -U release sourcesets
   46: """]]
   47: 
   48: For best performance, change the number after "-j" to the number of CPU cores
   49: you have, or slightly more.
   50: 
   51: ## Installing the target system
   52: 
   53: Install the system in a virtual machine, including the debug symbols and source code:
   54: 
   55: [[!template  id=programlisting text="""
   56:  $ cd ..
   57:  $ anita --workdir work --disk-size 4G --memory-size 256M \
   58:      --sets kern-GENERIC,modules,base,etc,comp,debug,games,man,misc,tests,text,syssrc,src,sharesrc,gnusrc \
   59:      install $(pwd)/obj/releasedir/i386/
   60: """]]
   61: 
   62: ## Booting the VMs
   63: 
   64: Next, start two qemu virtual machines, one to run the kernel being
   65: debugged (the "target VM") and another to run gdb (the "gdb VM").
   66: 
   67: The two VMs could be run on separate physical machines, but in this
   68: example, they are run on the same physical machine and share the same
   69: hard disk image.  This sharing is made possible by the "-snapshot"
   70: option to qemu, which ensures that the disk image is not written to by
   71: either VM.
   72: 
   73: First start the target VM, enabling qemu's built-in GDB target stub
   74: on TCP port 1234:
   75: 
   76: [[!template  id=programlisting text="""
   77:  $ qemu-system-i386 -nographic -snapshot -hda work/wd0.img -m 128 -gdb tcp::1234
   78: """]]
   79: 
   80: If you don't want everyone on the Internet to be able to debug your
   81: target, make sure incoming connections on port 1234 are blocked in
   82: your firewall.
   83: 
   84: In a second terminal window, start the gdb VM:
   85: 
   86: [[!template  id=programlisting text="""
   87:  $ qemu-system-i386 -nographic -snapshot -hda work/wd0.img -m 256
   88: """]]
   89: 
   90: Log in to the gdb VM as root and set up the network:
   91: 
   92: [[!template  id=programlisting text="""
   93:  login: root
   94:  # dhcpcd
   95: """]]
   96: 
   97: Start gdb on the gdb VM and connect to the target:
   98: 
   99: [[!template  id=programlisting text="""
  100:  # gdb /netbsd
  101:  (gdb) target remote my.host.name:1234
  102: """]]
  103: 
  104: where my.host.name is the domain name or IP address of the
  105: host system.
  106: 
  107: Now you should be able to get a stack trace and start debugging
  108: with full debug symbols and access to the source code:
  109: 
  110: [[!template  id=programlisting text="""
  111:  (gdb) where
  112:  (gdb) list
  113: """]]
  114: 
  115: If the stack trace prints very slowly (like 30 seconds per stack
  116: frame), it's likely because you are using a version of qemu where
  117: the user-mode networking code fails to disable the Nagle algorithm.
  118: This is fixed in the qemu in pkgsrc, but you may run into it if your
  119: qemu is not installed via pkgsrc.
  120: 
  121: ## Qemu tips
  122: 
  123: Here is a couple of useful qemu commands to know:
  124: 
  125: * Ctrl-a b will send a break which will make the NetBSD VM enter the ddb kernel debugger.
  126: 
  127: * Ctrl-a c will switch to the qemu monitor where you can enter commands like "quit" to exit qemu,
  128: or do things like saving/restoring the VM to/from a file.

CVSweb for NetBSD wikisrc <wikimaster@NetBSD.org> software: FreeBSD-CVSweb