20.2. Embedded Operating Systems

This section describes configurations involving the debugging of embedded operating systems that are available for several different architectures.

gdb includes the ability to debug programs running on various real-time operating systems.

20.2.1. Using gdb with VxWorks

target vxworks machinename

A VxWorks system, attached via TCP/IP. The argument machinename is the target system's machine name or IP address.

On VxWorks, load links filename dynamically on the current target system as well as adding its symbols in gdb.

gdb enables developers to spawn and debug tasks running on networked VxWorks targets from a Unix host. Already-running tasks spawned from the VxWorks shell can also be debugged. gdb uses code that runs on both the Unix host and on the VxWorks target. The program gdb is installed and executed on the Unix host. (It may be installed with the name vxgdb, to distinguish it from a gdb for debugging programs on the host itself.)

VxWorks-timeout args

All VxWorks-based targets now support the option vxworks-timeout. This option is set by the user, and args represents the number of seconds gdb waits for responses to rpc's. You might use this if your VxWorks target is a slow software simulator or is on the far side of a thin network line.

The following information on connecting to VxWorks was current when this manual was produced; newer releases of VxWorks may use revised procedures.

To use gdb with VxWorks, you must rebuild your VxWorks kernel to include the remote debugging interface routines in the VxWorks library rdb.a. To do this, define INCLUDE_RDB in the VxWorks configuration file configAll.h and rebuild your VxWorks kernel. The resulting kernel contains rdb.a, and spawns the source debugging task tRdbTask when VxWorks is booted. For more information on configuring and remaking VxWorks, see the manufacturer's manual.

Once you have included rdb.a in your VxWorks system image and set your Unix execution search path to find gdb, you are ready to run gdb. From your Unix host, run gdb (or vxgdb, depending on your installation).

gdb comes up showing the prompt:

(vxgdb)

20.2.1.1. Connecting to VxWorks

The gdb command target lets you connect to a VxWorks target on the network. To connect to a target whose host name is "tt", type:

(vxgdb) target vxworks tt

gdb displays messages like these:

Attaching remote machine across net...
Connected to tt.

gdb then attempts to read the symbol tables of any object modules loaded into the VxWorks target since it was last booted. gdb locates these files by searching the directories listed in the command search path (refer to Section 6.4 Your program's environment); if it fails to find an object file, it displays a message such as:

prog.o: No such file or directory.

When this happens, add the appropriate directory to the search path with the gdb command path, and execute the target command again.

20.2.1.2. VxWorks download

If you have connected to the VxWorks target and you want to debug an object that has not yet been loaded, you can use the gdb load command to download a file from Unix to VxWorks incrementally. The object file given as an argument to the load command is actually opened twice: first by the VxWorks target in order to download the code, then by gdb in order to read the symbol table. This can lead to problems if the current working directories on the two systems differ. If both systems have NFS mounted the same filesystems, you can avoid these problems by using absolute paths. Otherwise, it is simplest to set the working directory on both systems to the directory in which the object file resides, and then to reference the file by its name, without any path. For instance, a program prog.o may reside in vxpath/vw/demo/rdb in VxWorks and in hostpath/vw/demo/rdb on the host. To load this program, type this on VxWorks:

-> cd "vxpath/vw/demo/rdb"

Then, in gdb, type:

(vxgdb) cd hostpath/vw/demo/rdb
(vxgdb) load prog.o

gdb displays a response similar to this:

Reading symbol data from wherever/vw/demo/rdb/prog.o... done.

You can also use the load command to reload an object module after editing and recompiling the corresponding source file. Note that this makes gdb delete all currently-defined breakpoints, auto-displays, and convenience variables, and to clear the value history. (This is necessary in order to preserve the integrity of debugger's data structures that reference the target system's symbol table.)

20.2.1.3. Running tasks

You can also attach to an existing task using the attach command as follows:

(vxgdb) attach task

where task is the VxWorks hexadecimal task ID. The task can be running or suspended when you attach to it. Running tasks are suspended at the time of attachment.