File:  [NetBSD Developer Wiki] / wikisrc / users / haad / ddb_howto.mdwn
Revision 1.4: download - view: text, annotated - select for diffs
Wed May 20 21:12:48 2020 UTC (8 months ago) by sevan
Branches: MAIN
CVS tags: HEAD
there is no -g, filename is specified with -e

[[!meta title="NetBSD Developer Cheatsheet"]]

[[!toc]]


This article is going to be a collection of random notes which I have found during my development in kernel. I have found that there are some hints which every developer knows, but there is no documentation where newbie can learn them.


## Finding where the bug is

When you get a crash in the kernel you want to translate the address from the backtrace to the line in the source code:

    Stopped in pid 496.1 (gdb) at netbsd:breakpoint+0x5: leave

First, you need to find the address of the breakpoint function in the running kernel image with the [[!template id=man name="nm" section="1"]] command:

    nm netbsd | grep breakpoint

Then add `0x5` to the address, and use [[!template id=man name="addr2line" section="1"]] to get the exact line in the kernel source code where you get the crash:

    addr2line -e netbsd {sum address}

In [[!template id=man name="gdb" section="1"]], this can be achieved with the command `info line *(function_name)+0x5`.

## What to do if ddb backtrace doesn't work

The DDB backtrace command usually doesn't work when the EIP register was set to NULL, e.g. via a bad function pointer. In this case we can get part of the backtrace by using a different approach.

    db> show all reg

    eip 0 cs 0 eflags 0 esp 0xcb741b70

We need to find which address was set in the ESP register (this is the stack pointer register on i386). When we have our address we need to use

    x /Lx 0xcb741b70,20

to print the first 20 addresses from the stack. To easily find the address of the last function you need to look for an address with `0xc0` at the start.

The command `x /I c06428fc` will then translate the function address to it's name with the symbol table lookup.

## What to do if gdb cannot backtrace through trap()

Use `source .../sys/arch/i386/gdbscripts/stack` gdb script and run `stack`. See also [PR 10313](http://gnats.netbsd.org/10313).

## How to rebuild /boot

(This example assumes you are running NetBSD-i386)

    * Make sure you have the tools built
    * sys/arch/i386/stand/boot and enter $TOOLDIR/bin/nbmake-i386

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