www.delorie.com/gnu/docs/gdb/gdb_139.html   search  
 
Buy the book!


Debugging with GDB

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.3.3 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 section 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 or UDP 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 or tcp: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.

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

     
    target remote udp:manyfarms:2828
    

    When using a UDP connection for remote debugging, you should keep in mind that the `U' stands for "Unreliable". UDP can silently drop packets on busy or unreliable networks, which will cause havoc with your debugging session.

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.


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

  webmaster     delorie software   privacy  
  Copyright 2003   by The Free Software Foundation     Updated Jun 2003