Debugging with GDB

Node:Machine Code, Previous:Source Path, Up:Source

### Source and machine code

You can use the command `info line` to map source lines to program addresses (and vice versa), and the command `disassemble` to display a range of addresses as machine instructions. When run under GNU Emacs mode, the `info line` command causes the arrow to point to the line specified. Also, `info line` prints addresses in symbolic form as well as hex.

`info line` linespec``
  Print the starting and ending addresses of the compiled code for source line linespec. You can specify source lines in any of the ways understood by the `list` command (see Printing source lines).

For example, we can use `info line` to discover the location of the object code for the first line of function `m4_changequote`:

         (gdb) info line m4_changequote
         Line 895 of "builtin.c" starts at pc 0x634c and ends at 0x6350.

We can also inquire (using `*`addr`` as the form for linespec) what source line covers a particular address:

         (gdb) info line *0x63ff
         Line 926 of "builtin.c" starts at pc 0x63e4 and ends at 0x6404.

After `info line`, the default address for the `x` command is changed to the starting address of the line, so that `x/i` is sufficient to begin examining the machine code (see Examining memory). Also, this address is saved as the value of the convenience variable `$_` (see Convenience variables).

`disassemble`
  This specialized command dumps a range of memory as machine instructions. The default memory range is the function surrounding the program counter of the selected frame. A single argument to this command is a program counter value; GDB dumps the function surrounding this value. Two arguments specify a range of addresses (first inclusive, second exclusive) to dump.

The following example shows the disassembly of a range of addresses of HP PA-RISC 2.0 code:

         (gdb) disas 0x32c4 0x32e4
         Dump of assembler code from 0x32c4 to 0x32e4:
         0x32c4 <main+204>:      addil 0,dp
         0x32c8 <main+208>:      ldw 0x22c(sr0,r1),r26
         0x32cc <main+212>:      ldil 0x3000,r31
         0x32d0 <main+216>:      ble 0x3f8(sr4,r31)
         0x32d4 <main+220>:      ldo 0(r31),rp
         0x32d8 <main+224>:      addil -0x800,dp
         0x32dc <main+228>:      ldo 0x588(r1),r26
         0x32e0 <main+232>:      ldil 0x3000,r31
         End of assembler dump.

Some architectures have more than one commonly-used set of instruction mnemonics or other syntax.

`set disassembly-flavor` instruction-set``
  Select the instruction set to use when disassembling the program via the `disassemble` or `x/i` commands.

  Currently this command is only defined for the Intel x86 family. You can set instruction-set to either `intel` or `att`. The default is `att`, the AT&T flavor used by default by Unix assemblers for x86-based targets.