Debugging with GDB

Node:Debug Session, Previous:Bootstrapping, Up:remote stub

#### Putting it all together

In summary, when your program is ready to debug, you must follow these steps.

1. Make sure you have defined the supporting low-level routines (see What you must do for the stub):

                 getDebugChar, putDebugChar,
                 flush_i_cache, memset, exceptionHandler.

2. Insert these lines near the top of your program:

                 set_debug_traps();
                 breakpoint();

3. For the 680x0 stub only, you need to provide a variable called `exceptionHook`. Normally you just use:

                 void (*exceptionHook)() = 0;

   but if before calling `set_debug_traps`, you set it to point to a function in your program, that function is called when `GDB` continues after stopping on a trap (for example, bus error). The function indicated by `exceptionHook` is called with one parameter: an `int` which is the exception number.

4. Compile and link together: your program, the GDB debugging stub for your target architecture, and the supporting subroutines.
5. Make sure you have a serial connection between your target machine and the GDB host, and identify the serial port on the host.
6. Download your program to your target machine (or get it there by whatever means the manufacturer provides), and start it.
7. To start remote debugging, run GDB on the host machine, and specify as an executable file the program that is running in the remote machine. This tells GDB how to find your program's symbols and the contents of its pure text.
8. Establish communication using the `target remote` command. Its argument specifies how to communicate with the target machine--either via a devicename attached to a direct serial line, or a TCP port (usually to a terminal server which in turn has a serial line to the target). For example, to use a serial line connected to the device named `/dev/ttyb`:

                 target remote /dev/ttyb

   To use a TCP connection, use an argument of the form ``host`:port`. For example, to connect to port 2828 on a terminal server named `manyfarms`:

                 target remote manyfarms:2828

   If your remote target is actually running on the same machine as your debugger session (e.g. a simulator of your target running on the same host), you can omit the hostname. For example, to connect to port 1234 on your local machine:

                 target remote :1234

   Note that the colon is still required here.

Now you can use all the usual commands to examine and change data and to step and continue the remote program.

To resume the remote program and stop debugging it, use the `detach` command.

Whenever GDB is waiting for the remote program, if you type the interrupt character (often <C-C>), GDB attempts to stop the program. This may or may not succeed, depending in part on the hardware and the serial drivers the remote system uses. If you type the interrupt character once again, GDB displays this prompt:

         Interrupted while waiting for the program.
         Give up (and stop debugging it)?  (y or n)

If you type `y`, GDB abandons the remote debugging session. (If you decide you want to try again later, you can use `target remote` again to connect once more.) If you type `n`, GDB goes back to waiting.