| This is gdb.info, produced by makeinfo version 4.8 from ./gdb.texinfo. |
| |
| INFO-DIR-SECTION Software development |
| START-INFO-DIR-ENTRY |
| * Gdb: (gdb). The GNU debugger. |
| END-INFO-DIR-ENTRY |
| |
| Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, |
| 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, |
| 2010 Free Software Foundation, Inc. |
| |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.3 or |
| any later version published by the Free Software Foundation; with the |
| Invariant Sections being "Free Software" and "Free Software Needs Free |
| Documentation", with the Front-Cover Texts being "A GNU Manual," and |
| with the Back-Cover Texts as in (a) below. |
| |
| (a) The FSF's Back-Cover Text is: "You are free to copy and modify |
| this GNU Manual. Buying copies from GNU Press supports the FSF in |
| developing GNU and promoting software freedom." |
| |
| This file documents the GNU debugger GDB. |
| |
| This is the Ninth Edition, of `Debugging with GDB: the GNU |
| Source-Level Debugger' for GDB (GDB) Version 7.2. |
| |
| Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, |
| 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, |
| 2010 Free Software Foundation, Inc. |
| |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.3 or |
| any later version published by the Free Software Foundation; with the |
| Invariant Sections being "Free Software" and "Free Software Needs Free |
| Documentation", with the Front-Cover Texts being "A GNU Manual," and |
| with the Back-Cover Texts as in (a) below. |
| |
| (a) The FSF's Back-Cover Text is: "You are free to copy and modify |
| this GNU Manual. Buying copies from GNU Press supports the FSF in |
| developing GNU and promoting software freedom." |
| |
| |
| File: gdb.info, Node: Registers, Next: Floating Point Hardware, Prev: Convenience Vars, Up: Data |
| |
| 10.12 Registers |
| =============== |
| |
| You can refer to machine register contents, in expressions, as variables |
| with names starting with `$'. The names of registers are different for |
| each machine; use `info registers' to see the names used on your |
| machine. |
| |
| `info registers' |
| Print the names and values of all registers except floating-point |
| and vector registers (in the selected stack frame). |
| |
| `info all-registers' |
| Print the names and values of all registers, including |
| floating-point and vector registers (in the selected stack frame). |
| |
| `info registers REGNAME ...' |
| Print the "relativized" value of each specified register REGNAME. |
| As discussed in detail below, register values are normally |
| relative to the selected stack frame. REGNAME may be any register |
| name valid on the machine you are using, with or without the |
| initial `$'. |
| |
| GDB has four "standard" register names that are available (in |
| expressions) on most machines--whenever they do not conflict with an |
| architecture's canonical mnemonics for registers. The register names |
| `$pc' and `$sp' are used for the program counter register and the stack |
| pointer. `$fp' is used for a register that contains a pointer to the |
| current stack frame, and `$ps' is used for a register that contains the |
| processor status. For example, you could print the program counter in |
| hex with |
| |
| p/x $pc |
| |
| or print the instruction to be executed next with |
| |
| x/i $pc |
| |
| or add four to the stack pointer(1) with |
| |
| set $sp += 4 |
| |
| Whenever possible, these four standard register names are available |
| on your machine even though the machine has different canonical |
| mnemonics, so long as there is no conflict. The `info registers' |
| command shows the canonical names. For example, on the SPARC, `info |
| registers' displays the processor status register as `$psr' but you can |
| also refer to it as `$ps'; and on x86-based machines `$ps' is an alias |
| for the EFLAGS register. |
| |
| GDB always considers the contents of an ordinary register as an |
| integer when the register is examined in this way. Some machines have |
| special registers which can hold nothing but floating point; these |
| registers are considered to have floating point values. There is no way |
| to refer to the contents of an ordinary register as floating point value |
| (although you can _print_ it as a floating point value with `print/f |
| $REGNAME'). |
| |
| Some registers have distinct "raw" and "virtual" data formats. This |
| means that the data format in which the register contents are saved by |
| the operating system is not the same one that your program normally |
| sees. For example, the registers of the 68881 floating point |
| coprocessor are always saved in "extended" (raw) format, but all C |
| programs expect to work with "double" (virtual) format. In such cases, |
| GDB normally works with the virtual format only (the format that makes |
| sense for your program), but the `info registers' command prints the |
| data in both formats. |
| |
| Some machines have special registers whose contents can be |
| interpreted in several different ways. For example, modern x86-based |
| machines have SSE and MMX registers that can hold several values packed |
| together in several different formats. GDB refers to such registers in |
| `struct' notation: |
| |
| (gdb) print $xmm1 |
| $1 = { |
| v4_float = {0, 3.43859137e-038, 1.54142831e-044, 1.821688e-044}, |
| v2_double = {9.92129282474342e-303, 2.7585945287983262e-313}, |
| v16_int8 = "\000\000\000\000\3706;\001\v\000\000\000\r\000\000", |
| v8_int16 = {0, 0, 14072, 315, 11, 0, 13, 0}, |
| v4_int32 = {0, 20657912, 11, 13}, |
| v2_int64 = {88725056443645952, 55834574859}, |
| uint128 = 0x0000000d0000000b013b36f800000000 |
| } |
| |
| To set values of such registers, you need to tell GDB which view of the |
| register you wish to change, as if you were assigning value to a |
| `struct' member: |
| |
| (gdb) set $xmm1.uint128 = 0x000000000000000000000000FFFFFFFF |
| |
| Normally, register values are relative to the selected stack frame |
| (*note Selecting a Frame: Selection.). This means that you get the |
| value that the register would contain if all stack frames farther in |
| were exited and their saved registers restored. In order to see the |
| true contents of hardware registers, you must select the innermost |
| frame (with `frame 0'). |
| |
| However, GDB must deduce where registers are saved, from the machine |
| code generated by your compiler. If some registers are not saved, or if |
| GDB is unable to locate the saved registers, the selected stack frame |
| makes no difference. |
| |
| ---------- Footnotes ---------- |
| |
| (1) This is a way of removing one word from the stack, on machines |
| where stacks grow downward in memory (most machines, nowadays). This |
| assumes that the innermost stack frame is selected; setting `$sp' is |
| not allowed when other stack frames are selected. To pop entire frames |
| off the stack, regardless of machine architecture, use `return'; see |
| *Note Returning from a Function: Returning. |
| |
| |
| File: gdb.info, Node: Floating Point Hardware, Next: Vector Unit, Prev: Registers, Up: Data |
| |
| 10.13 Floating Point Hardware |
| ============================= |
| |
| Depending on the configuration, GDB may be able to give you more |
| information about the status of the floating point hardware. |
| |
| `info float' |
| Display hardware-dependent information about the floating point |
| unit. The exact contents and layout vary depending on the |
| floating point chip. Currently, `info float' is supported on the |
| ARM and x86 machines. |
| |
| |
| File: gdb.info, Node: Vector Unit, Next: OS Information, Prev: Floating Point Hardware, Up: Data |
| |
| 10.14 Vector Unit |
| ================= |
| |
| Depending on the configuration, GDB may be able to give you more |
| information about the status of the vector unit. |
| |
| `info vector' |
| Display information about the vector unit. The exact contents and |
| layout vary depending on the hardware. |
| |
| |
| File: gdb.info, Node: OS Information, Next: Memory Region Attributes, Prev: Vector Unit, Up: Data |
| |
| 10.15 Operating System Auxiliary Information |
| ============================================ |
| |
| GDB provides interfaces to useful OS facilities that can help you debug |
| your program. |
| |
| When GDB runs on a "Posix system" (such as GNU or Unix machines), it |
| interfaces with the inferior via the `ptrace' system call. The |
| operating system creates a special sata structure, called `struct |
| user', for this interface. You can use the command `info udot' to |
| display the contents of this data structure. |
| |
| `info udot' |
| Display the contents of the `struct user' maintained by the OS |
| kernel for the program being debugged. GDB displays the contents |
| of `struct user' as a list of hex numbers, similar to the |
| `examine' command. |
| |
| Some operating systems supply an "auxiliary vector" to programs at |
| startup. This is akin to the arguments and environment that you |
| specify for a program, but contains a system-dependent variety of |
| binary values that tell system libraries important details about the |
| hardware, operating system, and process. Each value's purpose is |
| identified by an integer tag; the meanings are well-known but |
| system-specific. Depending on the configuration and operating system |
| facilities, GDB may be able to show you this information. For remote |
| targets, this functionality may further depend on the remote stub's |
| support of the `qXfer:auxv:read' packet, see *Note qXfer auxiliary |
| vector read::. |
| |
| `info auxv' |
| Display the auxiliary vector of the inferior, which can be either a |
| live process or a core dump file. GDB prints each tag value |
| numerically, and also shows names and text descriptions for |
| recognized tags. Some values in the vector are numbers, some bit |
| masks, and some pointers to strings or other data. GDB displays |
| each value in the most appropriate form for a recognized tag, and |
| in hexadecimal for an unrecognized tag. |
| |
| On some targets, GDB can access operating-system-specific information |
| and display it to user, without interpretation. For remote targets, |
| this functionality depends on the remote stub's support of the |
| `qXfer:osdata:read' packet, see *Note qXfer osdata read::. |
| |
| `info os' |
| List the types of OS information available for the target. If the |
| target does not return a list of possible types, this command will |
| report an error. |
| |
| `info os processes' |
| Display the list of processes on the target. For each process, |
| GDB prints the process identifier, the name of the user, and the |
| command corresponding to the process. |
| |
| |
| File: gdb.info, Node: Memory Region Attributes, Next: Dump/Restore Files, Prev: OS Information, Up: Data |
| |
| 10.16 Memory Region Attributes |
| ============================== |
| |
| "Memory region attributes" allow you to describe special handling |
| required by regions of your target's memory. GDB uses attributes to |
| determine whether to allow certain types of memory accesses; whether to |
| use specific width accesses; and whether to cache target memory. By |
| default the description of memory regions is fetched from the target |
| (if the current target supports this), but the user can override the |
| fetched regions. |
| |
| Defined memory regions can be individually enabled and disabled. |
| When a memory region is disabled, GDB uses the default attributes when |
| accessing memory in that region. Similarly, if no memory regions have |
| been defined, GDB uses the default attributes when accessing all memory. |
| |
| When a memory region is defined, it is given a number to identify it; |
| to enable, disable, or remove a memory region, you specify that number. |
| |
| `mem LOWER UPPER ATTRIBUTES...' |
| Define a memory region bounded by LOWER and UPPER with attributes |
| ATTRIBUTES..., and add it to the list of regions monitored by GDB. |
| Note that UPPER == 0 is a special case: it is treated as the |
| target's maximum memory address. (0xffff on 16 bit targets, |
| 0xffffffff on 32 bit targets, etc.) |
| |
| `mem auto' |
| Discard any user changes to the memory regions and use |
| target-supplied regions, if available, or no regions if the target |
| does not support. |
| |
| `delete mem NUMS...' |
| Remove memory regions NUMS... from the list of regions monitored |
| by GDB. |
| |
| `disable mem NUMS...' |
| Disable monitoring of memory regions NUMS.... A disabled memory |
| region is not forgotten. It may be enabled again later. |
| |
| `enable mem NUMS...' |
| Enable monitoring of memory regions NUMS.... |
| |
| `info mem' |
| Print a table of all defined memory regions, with the following |
| columns for each region: |
| |
| _Memory Region Number_ |
| |
| _Enabled or Disabled._ |
| Enabled memory regions are marked with `y'. Disabled memory |
| regions are marked with `n'. |
| |
| _Lo Address_ |
| The address defining the inclusive lower bound of the memory |
| region. |
| |
| _Hi Address_ |
| The address defining the exclusive upper bound of the memory |
| region. |
| |
| _Attributes_ |
| The list of attributes set for this memory region. |
| |
| 10.16.1 Attributes |
| ------------------ |
| |
| 10.16.1.1 Memory Access Mode |
| ............................ |
| |
| The access mode attributes set whether GDB may make read or write |
| accesses to a memory region. |
| |
| While these attributes prevent GDB from performing invalid memory |
| accesses, they do nothing to prevent the target system, I/O DMA, etc. |
| from accessing memory. |
| |
| `ro' |
| Memory is read only. |
| |
| `wo' |
| Memory is write only. |
| |
| `rw' |
| Memory is read/write. This is the default. |
| |
| 10.16.1.2 Memory Access Size |
| ............................ |
| |
| The access size attribute tells GDB to use specific sized accesses in |
| the memory region. Often memory mapped device registers require |
| specific sized accesses. If no access size attribute is specified, GDB |
| may use accesses of any size. |
| |
| `8' |
| Use 8 bit memory accesses. |
| |
| `16' |
| Use 16 bit memory accesses. |
| |
| `32' |
| Use 32 bit memory accesses. |
| |
| `64' |
| Use 64 bit memory accesses. |
| |
| 10.16.1.3 Data Cache |
| .................... |
| |
| The data cache attributes set whether GDB will cache target memory. |
| While this generally improves performance by reducing debug protocol |
| overhead, it can lead to incorrect results because GDB does not know |
| about volatile variables or memory mapped device registers. |
| |
| `cache' |
| Enable GDB to cache target memory. |
| |
| `nocache' |
| Disable GDB from caching target memory. This is the default. |
| |
| 10.16.2 Memory Access Checking |
| ------------------------------ |
| |
| GDB can be instructed to refuse accesses to memory that is not |
| explicitly described. This can be useful if accessing such regions has |
| undesired effects for a specific target, or to provide better error |
| checking. The following commands control this behaviour. |
| |
| `set mem inaccessible-by-default [on|off]' |
| If `on' is specified, make GDB treat memory not explicitly |
| described by the memory ranges as non-existent and refuse accesses |
| to such memory. The checks are only performed if there's at least |
| one memory range defined. If `off' is specified, make GDB treat |
| the memory not explicitly described by the memory ranges as RAM. |
| The default value is `on'. |
| |
| `show mem inaccessible-by-default' |
| Show the current handling of accesses to unknown memory. |
| |
| |
| File: gdb.info, Node: Dump/Restore Files, Next: Core File Generation, Prev: Memory Region Attributes, Up: Data |
| |
| 10.17 Copy Between Memory and a File |
| ==================================== |
| |
| You can use the commands `dump', `append', and `restore' to copy data |
| between target memory and a file. The `dump' and `append' commands |
| write data to a file, and the `restore' command reads data from a file |
| back into the inferior's memory. Files may be in binary, Motorola |
| S-record, Intel hex, or Tektronix Hex format; however, GDB can only |
| append to binary files. |
| |
| `dump [FORMAT] memory FILENAME START_ADDR END_ADDR' |
| `dump [FORMAT] value FILENAME EXPR' |
| Dump the contents of memory from START_ADDR to END_ADDR, or the |
| value of EXPR, to FILENAME in the given format. |
| |
| The FORMAT parameter may be any one of: |
| `binary' |
| Raw binary form. |
| |
| `ihex' |
| Intel hex format. |
| |
| `srec' |
| Motorola S-record format. |
| |
| `tekhex' |
| Tektronix Hex format. |
| |
| GDB uses the same definitions of these formats as the GNU binary |
| utilities, like `objdump' and `objcopy'. If FORMAT is omitted, |
| GDB dumps the data in raw binary form. |
| |
| `append [binary] memory FILENAME START_ADDR END_ADDR' |
| `append [binary] value FILENAME EXPR' |
| Append the contents of memory from START_ADDR to END_ADDR, or the |
| value of EXPR, to the file FILENAME, in raw binary form. (GDB can |
| only append data to files in raw binary form.) |
| |
| `restore FILENAME [binary] BIAS START END' |
| Restore the contents of file FILENAME into memory. The `restore' |
| command can automatically recognize any known BFD file format, |
| except for raw binary. To restore a raw binary file you must |
| specify the optional keyword `binary' after the filename. |
| |
| If BIAS is non-zero, its value will be added to the addresses |
| contained in the file. Binary files always start at address zero, |
| so they will be restored at address BIAS. Other bfd files have a |
| built-in location; they will be restored at offset BIAS from that |
| location. |
| |
| If START and/or END are non-zero, then only data between file |
| offset START and file offset END will be restored. These offsets |
| are relative to the addresses in the file, before the BIAS |
| argument is applied. |
| |
| |
| |
| File: gdb.info, Node: Core File Generation, Next: Character Sets, Prev: Dump/Restore Files, Up: Data |
| |
| 10.18 How to Produce a Core File from Your Program |
| ================================================== |
| |
| A "core file" or "core dump" is a file that records the memory image of |
| a running process and its process status (register values etc.). Its |
| primary use is post-mortem debugging of a program that crashed while it |
| ran outside a debugger. A program that crashes automatically produces |
| a core file, unless this feature is disabled by the user. *Note |
| Files::, for information on invoking GDB in the post-mortem debugging |
| mode. |
| |
| Occasionally, you may wish to produce a core file of the program you |
| are debugging in order to preserve a snapshot of its state. GDB has a |
| special command for that. |
| |
| `generate-core-file [FILE]' |
| `gcore [FILE]' |
| Produce a core dump of the inferior process. The optional argument |
| FILE specifies the file name where to put the core dump. If not |
| specified, the file name defaults to `core.PID', where PID is the |
| inferior process ID. |
| |
| Note that this command is implemented only for some systems (as of |
| this writing, GNU/Linux, FreeBSD, Solaris, Unixware, and S390). |
| |
| |
| File: gdb.info, Node: Character Sets, Next: Caching Remote Data, Prev: Core File Generation, Up: Data |
| |
| 10.19 Character Sets |
| ==================== |
| |
| If the program you are debugging uses a different character set to |
| represent characters and strings than the one GDB uses itself, GDB can |
| automatically translate between the character sets for you. The |
| character set GDB uses we call the "host character set"; the one the |
| inferior program uses we call the "target character set". |
| |
| For example, if you are running GDB on a GNU/Linux system, which |
| uses the ISO Latin 1 character set, but you are using GDB's remote |
| protocol (*note Remote Debugging::) to debug a program running on an |
| IBM mainframe, which uses the EBCDIC character set, then the host |
| character set is Latin-1, and the target character set is EBCDIC. If |
| you give GDB the command `set target-charset EBCDIC-US', then GDB |
| translates between EBCDIC and Latin 1 as you print character or string |
| values, or use character and string literals in expressions. |
| |
| GDB has no way to automatically recognize which character set the |
| inferior program uses; you must tell it, using the `set target-charset' |
| command, described below. |
| |
| Here are the commands for controlling GDB's character set support: |
| |
| `set target-charset CHARSET' |
| Set the current target character set to CHARSET. To display the |
| list of supported target character sets, type |
| `set target-charset <TAB><TAB>'. |
| |
| `set host-charset CHARSET' |
| Set the current host character set to CHARSET. |
| |
| By default, GDB uses a host character set appropriate to the |
| system it is running on; you can override that default using the |
| `set host-charset' command. On some systems, GDB cannot |
| automatically determine the appropriate host character set. In |
| this case, GDB uses `UTF-8'. |
| |
| GDB can only use certain character sets as its host character set. |
| If you type `set target-charset <TAB><TAB>', GDB will list the |
| host character sets it supports. |
| |
| `set charset CHARSET' |
| Set the current host and target character sets to CHARSET. As |
| above, if you type `set charset <TAB><TAB>', GDB will list the |
| names of the character sets that can be used for both host and |
| target. |
| |
| `show charset' |
| Show the names of the current host and target character sets. |
| |
| `show host-charset' |
| Show the name of the current host character set. |
| |
| `show target-charset' |
| Show the name of the current target character set. |
| |
| `set target-wide-charset CHARSET' |
| Set the current target's wide character set to CHARSET. This is |
| the character set used by the target's `wchar_t' type. To display |
| the list of supported wide character sets, type |
| `set target-wide-charset <TAB><TAB>'. |
| |
| `show target-wide-charset' |
| Show the name of the current target's wide character set. |
| |
| Here is an example of GDB's character set support in action. Assume |
| that the following source code has been placed in the file |
| `charset-test.c': |
| |
| #include <stdio.h> |
| |
| char ascii_hello[] |
| = {72, 101, 108, 108, 111, 44, 32, 119, |
| 111, 114, 108, 100, 33, 10, 0}; |
| char ibm1047_hello[] |
| = {200, 133, 147, 147, 150, 107, 64, 166, |
| 150, 153, 147, 132, 90, 37, 0}; |
| |
| main () |
| { |
| printf ("Hello, world!\n"); |
| } |
| |
| In this program, `ascii_hello' and `ibm1047_hello' are arrays |
| containing the string `Hello, world!' followed by a newline, encoded in |
| the ASCII and IBM1047 character sets. |
| |
| We compile the program, and invoke the debugger on it: |
| |
| $ gcc -g charset-test.c -o charset-test |
| $ gdb -nw charset-test |
| GNU gdb 2001-12-19-cvs |
| Copyright 2001 Free Software Foundation, Inc. |
| ... |
| (gdb) |
| |
| We can use the `show charset' command to see what character sets GDB |
| is currently using to interpret and display characters and strings: |
| |
| (gdb) show charset |
| The current host and target character set is `ISO-8859-1'. |
| (gdb) |
| |
| For the sake of printing this manual, let's use ASCII as our initial |
| character set: |
| (gdb) set charset ASCII |
| (gdb) show charset |
| The current host and target character set is `ASCII'. |
| (gdb) |
| |
| Let's assume that ASCII is indeed the correct character set for our |
| host system -- in other words, let's assume that if GDB prints |
| characters using the ASCII character set, our terminal will display |
| them properly. Since our current target character set is also ASCII, |
| the contents of `ascii_hello' print legibly: |
| |
| (gdb) print ascii_hello |
| $1 = 0x401698 "Hello, world!\n" |
| (gdb) print ascii_hello[0] |
| $2 = 72 'H' |
| (gdb) |
| |
| GDB uses the target character set for character and string literals |
| you use in expressions: |
| |
| (gdb) print '+' |
| $3 = 43 '+' |
| (gdb) |
| |
| The ASCII character set uses the number 43 to encode the `+' |
| character. |
| |
| GDB relies on the user to tell it which character set the target |
| program uses. If we print `ibm1047_hello' while our target character |
| set is still ASCII, we get jibberish: |
| |
| (gdb) print ibm1047_hello |
| $4 = 0x4016a8 "\310\205\223\223\226k@\246\226\231\223\204Z%" |
| (gdb) print ibm1047_hello[0] |
| $5 = 200 '\310' |
| (gdb) |
| |
| If we invoke the `set target-charset' followed by <TAB><TAB>, GDB |
| tells us the character sets it supports: |
| |
| (gdb) set target-charset |
| ASCII EBCDIC-US IBM1047 ISO-8859-1 |
| (gdb) set target-charset |
| |
| We can select IBM1047 as our target character set, and examine the |
| program's strings again. Now the ASCII string is wrong, but GDB |
| translates the contents of `ibm1047_hello' from the target character |
| set, IBM1047, to the host character set, ASCII, and they display |
| correctly: |
| |
| (gdb) set target-charset IBM1047 |
| (gdb) show charset |
| The current host character set is `ASCII'. |
| The current target character set is `IBM1047'. |
| (gdb) print ascii_hello |
| $6 = 0x401698 "\110\145%%?\054\040\167?\162%\144\041\012" |
| (gdb) print ascii_hello[0] |
| $7 = 72 '\110' |
| (gdb) print ibm1047_hello |
| $8 = 0x4016a8 "Hello, world!\n" |
| (gdb) print ibm1047_hello[0] |
| $9 = 200 'H' |
| (gdb) |
| |
| As above, GDB uses the target character set for character and string |
| literals you use in expressions: |
| |
| (gdb) print '+' |
| $10 = 78 '+' |
| (gdb) |
| |
| The IBM1047 character set uses the number 78 to encode the `+' |
| character. |
| |
| |
| File: gdb.info, Node: Caching Remote Data, Next: Searching Memory, Prev: Character Sets, Up: Data |
| |
| 10.20 Caching Data of Remote Targets |
| ==================================== |
| |
| GDB caches data exchanged between the debugger and a remote target |
| (*note Remote Debugging::). Such caching generally improves |
| performance, because it reduces the overhead of the remote protocol by |
| bundling memory reads and writes into large chunks. Unfortunately, |
| simply caching everything would lead to incorrect results, since GDB |
| does not necessarily know anything about volatile values, memory-mapped |
| I/O addresses, etc. Furthermore, in non-stop mode (*note Non-Stop |
| Mode::) memory can be changed _while_ a gdb command is executing. |
| Therefore, by default, GDB only caches data known to be on the stack(1). |
| Other regions of memory can be explicitly marked as cacheable; see |
| *note Memory Region Attributes::. |
| |
| `set remotecache on' |
| `set remotecache off' |
| This option no longer does anything; it exists for compatibility |
| with old scripts. |
| |
| `show remotecache' |
| Show the current state of the obsolete remotecache flag. |
| |
| `set stack-cache on' |
| `set stack-cache off' |
| Enable or disable caching of stack accesses. When `ON', use |
| caching. By default, this option is `ON'. |
| |
| `show stack-cache' |
| Show the current state of data caching for memory accesses. |
| |
| `info dcache [line]' |
| Print the information about the data cache performance. The |
| information displayed includes the dcache width and depth, and for |
| each cache line, its number, address, and how many times it was |
| referenced. This command is useful for debugging the data cache |
| operation. |
| |
| If a line number is specified, the contents of that line will be |
| printed in hex. |
| |
| ---------- Footnotes ---------- |
| |
| (1) In non-stop mode, it is moderately rare for a running thread to |
| modify the stack of a stopped thread in a way that would interfere with |
| a backtrace, and caching of stack reads provides a significant speed up |
| of remote backtraces. |
| |
| |
| File: gdb.info, Node: Searching Memory, Prev: Caching Remote Data, Up: Data |
| |
| 10.21 Search Memory |
| =================== |
| |
| Memory can be searched for a particular sequence of bytes with the |
| `find' command. |
| |
| `find [/SN] START_ADDR, +LEN, VAL1 [, VAL2, ...]' |
| `find [/SN] START_ADDR, END_ADDR, VAL1 [, VAL2, ...]' |
| Search memory for the sequence of bytes specified by VAL1, VAL2, |
| etc. The search begins at address START_ADDR and continues for |
| either LEN bytes or through to END_ADDR inclusive. |
| |
| S and N are optional parameters. They may be specified in either |
| order, apart or together. |
| |
| S, search query size |
| The size of each search query value. |
| |
| `b' |
| bytes |
| |
| `h' |
| halfwords (two bytes) |
| |
| `w' |
| words (four bytes) |
| |
| `g' |
| giant words (eight bytes) |
| |
| All values are interpreted in the current language. This means, |
| for example, that if the current source language is C/C++ then |
| searching for the string "hello" includes the trailing '\0'. |
| |
| If the value size is not specified, it is taken from the value's |
| type in the current language. This is useful when one wants to |
| specify the search pattern as a mixture of types. Note that this |
| means, for example, that in the case of C-like languages a search |
| for an untyped 0x42 will search for `(int) 0x42' which is |
| typically four bytes. |
| |
| N, maximum number of finds |
| The maximum number of matches to print. The default is to print |
| all finds. |
| |
| You can use strings as search values. Quote them with double-quotes |
| (`"'). The string value is copied into the search pattern byte by |
| byte, regardless of the endianness of the target and the size |
| specification. |
| |
| The address of each match found is printed as well as a count of the |
| number of matches found. |
| |
| The address of the last value found is stored in convenience variable |
| `$_'. A count of the number of matches is stored in `$numfound'. |
| |
| For example, if stopped at the `printf' in this function: |
| |
| void |
| hello () |
| { |
| static char hello[] = "hello-hello"; |
| static struct { char c; short s; int i; } |
| __attribute__ ((packed)) mixed |
| = { 'c', 0x1234, 0x87654321 }; |
| printf ("%s\n", hello); |
| } |
| |
| you get during debugging: |
| |
| (gdb) find &hello[0], +sizeof(hello), "hello" |
| 0x804956d <hello.1620+6> |
| 1 pattern found |
| (gdb) find &hello[0], +sizeof(hello), 'h', 'e', 'l', 'l', 'o' |
| 0x8049567 <hello.1620> |
| 0x804956d <hello.1620+6> |
| 2 patterns found |
| (gdb) find /b1 &hello[0], +sizeof(hello), 'h', 0x65, 'l' |
| 0x8049567 <hello.1620> |
| 1 pattern found |
| (gdb) find &mixed, +sizeof(mixed), (char) 'c', (short) 0x1234, (int) 0x87654321 |
| 0x8049560 <mixed.1625> |
| 1 pattern found |
| (gdb) print $numfound |
| $1 = 1 |
| (gdb) print $_ |
| $2 = (void *) 0x8049560 |
| |
| |
| File: gdb.info, Node: Optimized Code, Next: Macros, Prev: Data, Up: Top |
| |
| 11 Debugging Optimized Code |
| *************************** |
| |
| Almost all compilers support optimization. With optimization disabled, |
| the compiler generates assembly code that corresponds directly to your |
| source code, in a simplistic way. As the compiler applies more |
| powerful optimizations, the generated assembly code diverges from your |
| original source code. With help from debugging information generated |
| by the compiler, GDB can map from the running program back to |
| constructs from your original source. |
| |
| GDB is more accurate with optimization disabled. If you can |
| recompile without optimization, it is easier to follow the progress of |
| your program during debugging. But, there are many cases where you may |
| need to debug an optimized version. |
| |
| When you debug a program compiled with `-g -O', remember that the |
| optimizer has rearranged your code; the debugger shows you what is |
| really there. Do not be too surprised when the execution path does not |
| exactly match your source file! An extreme example: if you define a |
| variable, but never use it, GDB never sees that variable--because the |
| compiler optimizes it out of existence. |
| |
| Some things do not work as well with `-g -O' as with just `-g', |
| particularly on machines with instruction scheduling. If in doubt, |
| recompile with `-g' alone, and if this fixes the problem, please report |
| it to us as a bug (including a test case!). *Note Variables::, for |
| more information about debugging optimized code. |
| |
| * Menu: |
| |
| * Inline Functions:: How GDB presents inlining |
| |
| |
| File: gdb.info, Node: Inline Functions, Up: Optimized Code |
| |
| 11.1 Inline Functions |
| ===================== |
| |
| "Inlining" is an optimization that inserts a copy of the function body |
| directly at each call site, instead of jumping to a shared routine. |
| GDB displays inlined functions just like non-inlined functions. They |
| appear in backtraces. You can view their arguments and local |
| variables, step into them with `step', skip them with `next', and |
| escape from them with `finish'. You can check whether a function was |
| inlined by using the `info frame' command. |
| |
| For GDB to support inlined functions, the compiler must record |
| information about inlining in the debug information -- GCC using the |
| DWARF 2 format does this, and several other compilers do also. GDB |
| only supports inlined functions when using DWARF 2. Versions of GCC |
| before 4.1 do not emit two required attributes (`DW_AT_call_file' and |
| `DW_AT_call_line'); GDB does not display inlined function calls with |
| earlier versions of GCC. It instead displays the arguments and local |
| variables of inlined functions as local variables in the caller. |
| |
| The body of an inlined function is directly included at its call |
| site; unlike a non-inlined function, there are no instructions devoted |
| to the call. GDB still pretends that the call site and the start of |
| the inlined function are different instructions. Stepping to the call |
| site shows the call site, and then stepping again shows the first line |
| of the inlined function, even though no additional instructions are |
| executed. |
| |
| This makes source-level debugging much clearer; you can see both the |
| context of the call and then the effect of the call. Only stepping by |
| a single instruction using `stepi' or `nexti' does not do this; single |
| instruction steps always show the inlined body. |
| |
| There are some ways that GDB does not pretend that inlined function |
| calls are the same as normal calls: |
| |
| * You cannot set breakpoints on inlined functions. GDB either |
| reports that there is no symbol with that name, or else sets the |
| breakpoint only on non-inlined copies of the function. This |
| limitation will be removed in a future version of GDB; until then, |
| set a breakpoint by line number on the first line of the inlined |
| function instead. |
| |
| * Setting breakpoints at the call site of an inlined function may not |
| work, because the call site does not contain any code. GDB may |
| incorrectly move the breakpoint to the next line of the enclosing |
| function, after the call. This limitation will be removed in a |
| future version of GDB; until then, set a breakpoint on an earlier |
| line or inside the inlined function instead. |
| |
| * GDB cannot locate the return value of inlined calls after using |
| the `finish' command. This is a limitation of compiler-generated |
| debugging information; after `finish', you can step to the next |
| line and print a variable where your program stored the return |
| value. |
| |
| |
| |
| File: gdb.info, Node: Macros, Next: Tracepoints, Prev: Optimized Code, Up: Top |
| |
| 12 C Preprocessor Macros |
| ************************ |
| |
| Some languages, such as C and C++, provide a way to define and invoke |
| "preprocessor macros" which expand into strings of tokens. GDB can |
| evaluate expressions containing macro invocations, show the result of |
| macro expansion, and show a macro's definition, including where it was |
| defined. |
| |
| You may need to compile your program specially to provide GDB with |
| information about preprocessor macros. Most compilers do not include |
| macros in their debugging information, even when you compile with the |
| `-g' flag. *Note Compilation::. |
| |
| A program may define a macro at one point, remove that definition |
| later, and then provide a different definition after that. Thus, at |
| different points in the program, a macro may have different |
| definitions, or have no definition at all. If there is a current stack |
| frame, GDB uses the macros in scope at that frame's source code line. |
| Otherwise, GDB uses the macros in scope at the current listing location; |
| see *Note List::. |
| |
| Whenever GDB evaluates an expression, it always expands any macro |
| invocations present in the expression. GDB also provides the following |
| commands for working with macros explicitly. |
| |
| `macro expand EXPRESSION' |
| `macro exp EXPRESSION' |
| Show the results of expanding all preprocessor macro invocations in |
| EXPRESSION. Since GDB simply expands macros, but does not parse |
| the result, EXPRESSION need not be a valid expression; it can be |
| any string of tokens. |
| |
| `macro expand-once EXPRESSION' |
| `macro exp1 EXPRESSION' |
| (This command is not yet implemented.) Show the results of |
| expanding those preprocessor macro invocations that appear |
| explicitly in EXPRESSION. Macro invocations appearing in that |
| expansion are left unchanged. This command allows you to see the |
| effect of a particular macro more clearly, without being confused |
| by further expansions. Since GDB simply expands macros, but does |
| not parse the result, EXPRESSION need not be a valid expression; it |
| can be any string of tokens. |
| |
| `info macro MACRO' |
| Show the definition of the macro named MACRO, and describe the |
| source location or compiler command-line where that definition was |
| established. |
| |
| `macro define MACRO REPLACEMENT-LIST' |
| `macro define MACRO(ARGLIST) REPLACEMENT-LIST' |
| Introduce a definition for a preprocessor macro named MACRO, |
| invocations of which are replaced by the tokens given in |
| REPLACEMENT-LIST. The first form of this command defines an |
| "object-like" macro, which takes no arguments; the second form |
| defines a "function-like" macro, which takes the arguments given in |
| ARGLIST. |
| |
| A definition introduced by this command is in scope in every |
| expression evaluated in GDB, until it is removed with the `macro |
| undef' command, described below. The definition overrides all |
| definitions for MACRO present in the program being debugged, as |
| well as any previous user-supplied definition. |
| |
| `macro undef MACRO' |
| Remove any user-supplied definition for the macro named MACRO. |
| This command only affects definitions provided with the `macro |
| define' command, described above; it cannot remove definitions |
| present in the program being debugged. |
| |
| `macro list' |
| List all the macros defined using the `macro define' command. |
| |
| Here is a transcript showing the above commands in action. First, we |
| show our source files: |
| |
| $ cat sample.c |
| #include <stdio.h> |
| #include "sample.h" |
| |
| #define M 42 |
| #define ADD(x) (M + x) |
| |
| main () |
| { |
| #define N 28 |
| printf ("Hello, world!\n"); |
| #undef N |
| printf ("We're so creative.\n"); |
| #define N 1729 |
| printf ("Goodbye, world!\n"); |
| } |
| $ cat sample.h |
| #define Q < |
| $ |
| |
| Now, we compile the program using the GNU C compiler, GCC. We pass |
| the `-gdwarf-2' and `-g3' flags to ensure the compiler includes |
| information about preprocessor macros in the debugging information. |
| |
| $ gcc -gdwarf-2 -g3 sample.c -o sample |
| $ |
| |
| Now, we start GDB on our sample program: |
| |
| $ gdb -nw sample |
| GNU gdb 2002-05-06-cvs |
| Copyright 2002 Free Software Foundation, Inc. |
| GDB is free software, ... |
| (gdb) |
| |
| We can expand macros and examine their definitions, even when the |
| program is not running. GDB uses the current listing position to |
| decide which macro definitions are in scope: |
| |
| (gdb) list main |
| 3 |
| 4 #define M 42 |
| 5 #define ADD(x) (M + x) |
| 6 |
| 7 main () |
| 8 { |
| 9 #define N 28 |
| 10 printf ("Hello, world!\n"); |
| 11 #undef N |
| 12 printf ("We're so creative.\n"); |
| (gdb) info macro ADD |
| Defined at /home/jimb/gdb/macros/play/sample.c:5 |
| #define ADD(x) (M + x) |
| (gdb) info macro Q |
| Defined at /home/jimb/gdb/macros/play/sample.h:1 |
| included at /home/jimb/gdb/macros/play/sample.c:2 |
| #define Q < |
| (gdb) macro expand ADD(1) |
| expands to: (42 + 1) |
| (gdb) macro expand-once ADD(1) |
| expands to: once (M + 1) |
| (gdb) |
| |
| In the example above, note that `macro expand-once' expands only the |
| macro invocation explicit in the original text -- the invocation of |
| `ADD' -- but does not expand the invocation of the macro `M', which was |
| introduced by `ADD'. |
| |
| Once the program is running, GDB uses the macro definitions in force |
| at the source line of the current stack frame: |
| |
| (gdb) break main |
| Breakpoint 1 at 0x8048370: file sample.c, line 10. |
| (gdb) run |
| Starting program: /home/jimb/gdb/macros/play/sample |
| |
| Breakpoint 1, main () at sample.c:10 |
| 10 printf ("Hello, world!\n"); |
| (gdb) |
| |
| At line 10, the definition of the macro `N' at line 9 is in force: |
| |
| (gdb) info macro N |
| Defined at /home/jimb/gdb/macros/play/sample.c:9 |
| #define N 28 |
| (gdb) macro expand N Q M |
| expands to: 28 < 42 |
| (gdb) print N Q M |
| $1 = 1 |
| (gdb) |
| |
| As we step over directives that remove `N''s definition, and then |
| give it a new definition, GDB finds the definition (or lack thereof) in |
| force at each point: |
| |
| (gdb) next |
| Hello, world! |
| 12 printf ("We're so creative.\n"); |
| (gdb) info macro N |
| The symbol `N' has no definition as a C/C++ preprocessor macro |
| at /home/jimb/gdb/macros/play/sample.c:12 |
| (gdb) next |
| We're so creative. |
| 14 printf ("Goodbye, world!\n"); |
| (gdb) info macro N |
| Defined at /home/jimb/gdb/macros/play/sample.c:13 |
| #define N 1729 |
| (gdb) macro expand N Q M |
| expands to: 1729 < 42 |
| (gdb) print N Q M |
| $2 = 0 |
| (gdb) |
| |
| In addition to source files, macros can be defined on the |
| compilation command line using the `-DNAME=VALUE' syntax. For macros |
| defined in such a way, GDB displays the location of their definition as |
| line zero of the source file submitted to the compiler. |
| |
| (gdb) info macro __STDC__ |
| Defined at /home/jimb/gdb/macros/play/sample.c:0 |
| -D__STDC__=1 |
| (gdb) |
| |
| |
| File: gdb.info, Node: Tracepoints, Next: Overlays, Prev: Macros, Up: Top |
| |
| 13 Tracepoints |
| ************** |
| |
| In some applications, it is not feasible for the debugger to interrupt |
| the program's execution long enough for the developer to learn anything |
| helpful about its behavior. If the program's correctness depends on |
| its real-time behavior, delays introduced by a debugger might cause the |
| program to change its behavior drastically, or perhaps fail, even when |
| the code itself is correct. It is useful to be able to observe the |
| program's behavior without interrupting it. |
| |
| Using GDB's `trace' and `collect' commands, you can specify |
| locations in the program, called "tracepoints", and arbitrary |
| expressions to evaluate when those tracepoints are reached. Later, |
| using the `tfind' command, you can examine the values those expressions |
| had when the program hit the tracepoints. The expressions may also |
| denote objects in memory--structures or arrays, for example--whose |
| values GDB should record; while visiting a particular tracepoint, you |
| may inspect those objects as if they were in memory at that moment. |
| However, because GDB records these values without interacting with you, |
| it can do so quickly and unobtrusively, hopefully not disturbing the |
| program's behavior. |
| |
| The tracepoint facility is currently available only for remote |
| targets. *Note Targets::. In addition, your remote target must know |
| how to collect trace data. This functionality is implemented in the |
| remote stub; however, none of the stubs distributed with GDB support |
| tracepoints as of this writing. The format of the remote packets used |
| to implement tracepoints are described in *Note Tracepoint Packets::. |
| |
| It is also possible to get trace data from a file, in a manner |
| reminiscent of corefiles; you specify the filename, and use `tfind' to |
| search through the file. *Note Trace Files::, for more details. |
| |
| This chapter describes the tracepoint commands and features. |
| |
| * Menu: |
| |
| * Set Tracepoints:: |
| * Analyze Collected Data:: |
| * Tracepoint Variables:: |
| * Trace Files:: |
| |
| |
| File: gdb.info, Node: Set Tracepoints, Next: Analyze Collected Data, Up: Tracepoints |
| |
| 13.1 Commands to Set Tracepoints |
| ================================ |
| |
| Before running such a "trace experiment", an arbitrary number of |
| tracepoints can be set. A tracepoint is actually a special type of |
| breakpoint (*note Set Breaks::), so you can manipulate it using |
| standard breakpoint commands. For instance, as with breakpoints, |
| tracepoint numbers are successive integers starting from one, and many |
| of the commands associated with tracepoints take the tracepoint number |
| as their argument, to identify which tracepoint to work on. |
| |
| For each tracepoint, you can specify, in advance, some arbitrary set |
| of data that you want the target to collect in the trace buffer when it |
| hits that tracepoint. The collected data can include registers, local |
| variables, or global data. Later, you can use GDB commands to examine |
| the values these data had at the time the tracepoint was hit. |
| |
| Tracepoints do not support every breakpoint feature. Ignore counts |
| on tracepoints have no effect, and tracepoints cannot run GDB commands |
| when they are hit. Tracepoints may not be thread-specific either. |
| |
| Some targets may support "fast tracepoints", which are inserted in a |
| different way (such as with a jump instead of a trap), that is faster |
| but possibly restricted in where they may be installed. |
| |
| Regular and fast tracepoints are dynamic tracing facilities, meaning |
| that they can be used to insert tracepoints at (almost) any location in |
| the target. Some targets may also support controlling "static |
| tracepoints" from GDB. With static tracing, a set of instrumentation |
| points, also known as "markers", are embedded in the target program, |
| and can be activated or deactivated by name or address. These are |
| usually placed at locations which facilitate investigating what the |
| target is actually doing. GDB's support for static tracing includes |
| being able to list instrumentation points, and attach them with GDB |
| defined high level tracepoints that expose the whole range of |
| convenience of GDB's tracepoints support. Namelly, support for |
| collecting registers values and values of global or local (to the |
| instrumentation point) variables; tracepoint conditions and trace state |
| variables. The act of installing a GDB static tracepoint on an |
| instrumentation point, or marker, is referred to as "probing" a static |
| tracepoint marker. |
| |
| `gdbserver' supports tracepoints on some target systems. *Note |
| Tracepoints support in `gdbserver': Server. |
| |
| This section describes commands to set tracepoints and associated |
| conditions and actions. |
| |
| * Menu: |
| |
| * Create and Delete Tracepoints:: |
| * Enable and Disable Tracepoints:: |
| * Tracepoint Passcounts:: |
| * Tracepoint Conditions:: |
| * Trace State Variables:: |
| * Tracepoint Actions:: |
| * Listing Tracepoints:: |
| * Listing Static Tracepoint Markers:: |
| * Starting and Stopping Trace Experiments:: |
| * Tracepoint Restrictions:: |
| |
| |
| File: gdb.info, Node: Create and Delete Tracepoints, Next: Enable and Disable Tracepoints, Up: Set Tracepoints |
| |
| 13.1.1 Create and Delete Tracepoints |
| ------------------------------------ |
| |
| `trace LOCATION' |
| The `trace' command is very similar to the `break' command. Its |
| argument LOCATION can be a source line, a function name, or an |
| address in the target program. *Note Specify Location::. The |
| `trace' command defines a tracepoint, which is a point in the |
| target program where the debugger will briefly stop, collect some |
| data, and then allow the program to continue. Setting a |
| tracepoint or changing its actions doesn't take effect until the |
| next `tstart' command, and once a trace experiment is running, |
| further changes will not have any effect until the next trace |
| experiment starts. |
| |
| Here are some examples of using the `trace' command: |
| |
| (gdb) trace foo.c:121 // a source file and line number |
| |
| (gdb) trace +2 // 2 lines forward |
| |
| (gdb) trace my_function // first source line of function |
| |
| (gdb) trace *my_function // EXACT start address of function |
| |
| (gdb) trace *0x2117c4 // an address |
| |
| You can abbreviate `trace' as `tr'. |
| |
| `trace LOCATION if COND' |
| Set a tracepoint with condition COND; evaluate the expression COND |
| each time the tracepoint is reached, and collect data only if the |
| value is nonzero--that is, if COND evaluates as true. *Note |
| Tracepoint Conditions: Tracepoint Conditions, for more information |
| on tracepoint conditions. |
| |
| `ftrace LOCATION [ if COND ]' |
| The `ftrace' command sets a fast tracepoint. For targets that |
| support them, fast tracepoints will use a more efficient but |
| possibly less general technique to trigger data collection, such |
| as a jump instruction instead of a trap, or some sort of hardware |
| support. It may not be possible to create a fast tracepoint at |
| the desired location, in which case the command will exit with an |
| explanatory message. |
| |
| GDB handles arguments to `ftrace' exactly as for `trace'. |
| |
| `strace LOCATION [ if COND ]' |
| The `strace' command sets a static tracepoint. For targets that |
| support it, setting a static tracepoint probes a static |
| instrumentation point, or marker, found at LOCATION. It may not |
| be possible to set a static tracepoint at the desired location, in |
| which case the command will exit with an explanatory message. |
| |
| GDB handles arguments to `strace' exactly as for `trace', with the |
| addition that the user can also specify `-m MARKER' as LOCATION. |
| This probes the marker identified by the MARKER string identifier. |
| This identifier depends on the static tracepoint backend library |
| your program is using. You can find all the marker identifiers in |
| the `ID' field of the `info static-tracepoint-markers' command |
| output. *Note Listing Static Tracepoint Markers: Listing Static |
| Tracepoint Markers. For example, in the following small program |
| using the UST tracing engine: |
| |
| main () |
| { |
| trace_mark(ust, bar33, "str %s", "FOOBAZ"); |
| } |
| |
| the marker id is composed of joining the first two arguments to the |
| `trace_mark' call with a slash, which translates to: |
| |
| (gdb) info static-tracepoint-markers |
| Cnt Enb ID Address What |
| 1 n ust/bar33 0x0000000000400ddc in main at stexample.c:22 |
| Data: "str %s" |
| [etc...] |
| |
| so you may probe the marker above with: |
| |
| (gdb) strace -m ust/bar33 |
| |
| Static tracepoints accept an extra collect action -- `collect |
| $_sdata'. This collects arbitrary user data passed in the probe |
| point call to the tracing library. In the UST example above, |
| you'll see that the third argument to `trace_mark' is a |
| printf-like format string. The user data is then the result of |
| running that formating string against the following arguments. |
| Note that `info static-tracepoint-markers' command output lists |
| that format string in the `Data:' field. |
| |
| You can inspect this data when analyzing the trace buffer, by |
| printing the $_sdata variable like any other variable available to |
| GDB. *Note Tracepoint Action Lists: Tracepoint Actions. |
| |
| The convenience variable `$tpnum' records the tracepoint number of |
| the most recently set tracepoint. |
| |
| `delete tracepoint [NUM]' |
| Permanently delete one or more tracepoints. With no argument, the |
| default is to delete all tracepoints. Note that the regular |
| `delete' command can remove tracepoints also. |
| |
| Examples: |
| |
| (gdb) delete trace 1 2 3 // remove three tracepoints |
| |
| (gdb) delete trace // remove all tracepoints |
| |
| You can abbreviate this command as `del tr'. |
| |
| |
| File: gdb.info, Node: Enable and Disable Tracepoints, Next: Tracepoint Passcounts, Prev: Create and Delete Tracepoints, Up: Set Tracepoints |
| |
| 13.1.2 Enable and Disable Tracepoints |
| ------------------------------------- |
| |
| These commands are deprecated; they are equivalent to plain `disable' |
| and `enable'. |
| |
| `disable tracepoint [NUM]' |
| Disable tracepoint NUM, or all tracepoints if no argument NUM is |
| given. A disabled tracepoint will have no effect during the next |
| trace experiment, but it is not forgotten. You can re-enable a |
| disabled tracepoint using the `enable tracepoint' command. |
| |
| `enable tracepoint [NUM]' |
| Enable tracepoint NUM, or all tracepoints. The enabled |
| tracepoints will become effective the next time a trace experiment |
| is run. |
| |
| |
| File: gdb.info, Node: Tracepoint Passcounts, Next: Tracepoint Conditions, Prev: Enable and Disable Tracepoints, Up: Set Tracepoints |
| |
| 13.1.3 Tracepoint Passcounts |
| ---------------------------- |
| |
| `passcount [N [NUM]]' |
| Set the "passcount" of a tracepoint. The passcount is a way to |
| automatically stop a trace experiment. If a tracepoint's |
| passcount is N, then the trace experiment will be automatically |
| stopped on the N'th time that tracepoint is hit. If the |
| tracepoint number NUM is not specified, the `passcount' command |
| sets the passcount of the most recently defined tracepoint. If no |
| passcount is given, the trace experiment will run until stopped |
| explicitly by the user. |
| |
| Examples: |
| |
| (gdb) passcount 5 2 // Stop on the 5th execution of |
| `// tracepoint 2' |
| |
| (gdb) passcount 12 // Stop on the 12th execution of the |
| `// most recently defined tracepoint.' |
| (gdb) trace foo |
| (gdb) pass 3 |
| (gdb) trace bar |
| (gdb) pass 2 |
| (gdb) trace baz |
| (gdb) pass 1 // Stop tracing when foo has been |
| `// executed 3 times OR when bar has' |
| `// been executed 2 times' |
| `// OR when baz has been executed 1 time.' |
| |
| |
| |
| File: gdb.info, Node: Tracepoint Conditions, Next: Trace State Variables, Prev: Tracepoint Passcounts, Up: Set Tracepoints |
| |
| 13.1.4 Tracepoint Conditions |
| ---------------------------- |
| |
| The simplest sort of tracepoint collects data every time your program |
| reaches a specified place. You can also specify a "condition" for a |
| tracepoint. A condition is just a Boolean expression in your |
| programming language (*note Expressions: Expressions.). A tracepoint |
| with a condition evaluates the expression each time your program |
| reaches it, and data collection happens only if the condition is true. |
| |
| Tracepoint conditions can be specified when a tracepoint is set, by |
| using `if' in the arguments to the `trace' command. *Note Setting |
| Tracepoints: Create and Delete Tracepoints. They can also be set or |
| changed at any time with the `condition' command, just as with |
| breakpoints. |
| |
| Unlike breakpoint conditions, GDB does not actually evaluate the |
| conditional expression itself. Instead, GDB encodes the expression |
| into an agent expression (*note Agent Expressions:: suitable for |
| execution on the target, independently of GDB. Global variables become |
| raw memory locations, locals become stack accesses, and so forth. |
| |
| For instance, suppose you have a function that is usually called |
| frequently, but should not be called after an error has occurred. You |
| could use the following tracepoint command to collect data about calls |
| of that function that happen while the error code is propagating |
| through the program; an unconditional tracepoint could end up |
| collecting thousands of useless trace frames that you would have to |
| search through. |
| |
| (gdb) trace normal_operation if errcode > 0 |
| |
| |
| File: gdb.info, Node: Trace State Variables, Next: Tracepoint Actions, Prev: Tracepoint Conditions, Up: Set Tracepoints |
| |
| 13.1.5 Trace State Variables |
| ---------------------------- |
| |
| A "trace state variable" is a special type of variable that is created |
| and managed by target-side code. The syntax is the same as that for |
| GDB's convenience variables (a string prefixed with "$"), but they are |
| stored on the target. They must be created explicitly, using a |
| `tvariable' command. They are always 64-bit signed integers. |
| |
| Trace state variables are remembered by GDB, and downloaded to the |
| target along with tracepoint information when the trace experiment |
| starts. There are no intrinsic limits on the number of trace state |
| variables, beyond memory limitations of the target. |
| |
| Although trace state variables are managed by the target, you can use |
| them in print commands and expressions as if they were convenience |
| variables; GDB will get the current value from the target while the |
| trace experiment is running. Trace state variables share the same |
| namespace as other "$" variables, which means that you cannot have |
| trace state variables with names like `$23' or `$pc', nor can you have |
| a trace state variable and a convenience variable with the same name. |
| |
| `tvariable $NAME [ = EXPRESSION ]' |
| The `tvariable' command creates a new trace state variable named |
| `$NAME', and optionally gives it an initial value of EXPRESSION. |
| EXPRESSION is evaluated when this command is entered; the result |
| will be converted to an integer if possible, otherwise GDB will |
| report an error. A subsequent `tvariable' command specifying the |
| same name does not create a variable, but instead assigns the |
| supplied initial value to the existing variable of that name, |
| overwriting any previous initial value. The default initial value |
| is 0. |
| |
| `info tvariables' |
| List all the trace state variables along with their initial values. |
| Their current values may also be displayed, if the trace |
| experiment is currently running. |
| |
| `delete tvariable [ $NAME ... ]' |
| Delete the given trace state variables, or all of them if no |
| arguments are specified. |
| |
| |
| |
| File: gdb.info, Node: Tracepoint Actions, Next: Listing Tracepoints, Prev: Trace State Variables, Up: Set Tracepoints |
| |
| 13.1.6 Tracepoint Action Lists |
| ------------------------------ |
| |
| `actions [NUM]' |
| This command will prompt for a list of actions to be taken when the |
| tracepoint is hit. If the tracepoint number NUM is not specified, |
| this command sets the actions for the one that was most recently |
| defined (so that you can define a tracepoint and then say |
| `actions' without bothering about its number). You specify the |
| actions themselves on the following lines, one action at a time, |
| and terminate the actions list with a line containing just `end'. |
| So far, the only defined actions are `collect', `teval', and |
| `while-stepping'. |
| |
| `actions' is actually equivalent to `commands' (*note Breakpoint |
| Command Lists: Break Commands.), except that only the defined |
| actions are allowed; any other GDB command is rejected. |
| |
| To remove all actions from a tracepoint, type `actions NUM' and |
| follow it immediately with `end'. |
| |
| (gdb) collect DATA // collect some data |
| |
| (gdb) while-stepping 5 // single-step 5 times, collect data |
| |
| (gdb) end // signals the end of actions. |
| |
| In the following example, the action list begins with `collect' |
| commands indicating the things to be collected when the tracepoint |
| is hit. Then, in order to single-step and collect additional data |
| following the tracepoint, a `while-stepping' command is used, |
| followed by the list of things to be collected after each step in a |
| sequence of single steps. The `while-stepping' command is |
| terminated by its own separate `end' command. Lastly, the action |
| list is terminated by an `end' command. |
| |
| (gdb) trace foo |
| (gdb) actions |
| Enter actions for tracepoint 1, one per line: |
| > collect bar,baz |
| > collect $regs |
| > while-stepping 12 |
| > collect $pc, arr[i] |
| > end |
| end |
| |
| `collect EXPR1, EXPR2, ...' |
| Collect values of the given expressions when the tracepoint is hit. |
| This command accepts a comma-separated list of any valid |
| expressions. In addition to global, static, or local variables, |
| the following special arguments are supported: |
| |
| `$regs' |
| Collect all registers. |
| |
| `$args' |
| Collect all function arguments. |
| |
| `$locals' |
| Collect all local variables. |
| |
| `$_sdata' |
| Collect static tracepoint marker specific data. Only |
| available for static tracepoints. *Note Tracepoint Action |
| Lists: Tracepoint Actions. On the UST static tracepoints |
| library backend, an instrumentation point resembles a |
| `printf' function call. The tracing library is able to |
| collect user specified data formatted to a character string |
| using the format provided by the programmer that instrumented |
| the program. Other backends have similar mechanisms. Here's |
| an example of a UST marker call: |
| |
| const char master_name[] = "$your_name"; |
| trace_mark(channel1, marker1, "hello %s", master_name) |
| |
| In this case, collecting `$_sdata' collects the string `hello |
| $yourname'. When analyzing the trace buffer, you can inspect |
| `$_sdata' like any other variable available to GDB. |
| |
| You can give several consecutive `collect' commands, each one with |
| a single argument, or one `collect' command with several arguments |
| separated by commas; the effect is the same. |
| |
| The command `info scope' (*note info scope: Symbols.) is |
| particularly useful for figuring out what data to collect. |
| |
| `teval EXPR1, EXPR2, ...' |
| Evaluate the given expressions when the tracepoint is hit. This |
| command accepts a comma-separated list of expressions. The results |
| are discarded, so this is mainly useful for assigning values to |
| trace state variables (*note Trace State Variables::) without |
| adding those values to the trace buffer, as would be the case if |
| the `collect' action were used. |
| |
| `while-stepping N' |
| Perform N single-step instruction traces after the tracepoint, |
| collecting new data after each step. The `while-stepping' command |
| is followed by the list of what to collect while stepping |
| (followed by its own `end' command): |
| |
| > while-stepping 12 |
| > collect $regs, myglobal |
| > end |
| > |
| |
| Note that `$pc' is not automatically collected by |
| `while-stepping'; you need to explicitly collect that register if |
| you need it. You may abbreviate `while-stepping' as `ws' or |
| `stepping'. |
| |
| `set default-collect EXPR1, EXPR2, ...' |
| This variable is a list of expressions to collect at each |
| tracepoint hit. It is effectively an additional `collect' action |
| prepended to every tracepoint action list. The expressions are |
| parsed individually for each tracepoint, so for instance a |
| variable named `xyz' may be interpreted as a global for one |
| tracepoint, and a local for another, as appropriate to the |
| tracepoint's location. |
| |
| `show default-collect' |
| Show the list of expressions that are collected by default at each |
| tracepoint hit. |
| |
| |
| |
| File: gdb.info, Node: Listing Tracepoints, Next: Listing Static Tracepoint Markers, Prev: Tracepoint Actions, Up: Set Tracepoints |
| |
| 13.1.7 Listing Tracepoints |
| -------------------------- |
| |
| `info tracepoints [NUM]' |
| Display information about the tracepoint NUM. If you don't |
| specify a tracepoint number, displays information about all the |
| tracepoints defined so far. The format is similar to that used for |
| `info breakpoints'; in fact, `info tracepoints' is the same |
| command, simply restricting itself to tracepoints. |
| |
| A tracepoint's listing may include additional information specific |
| to tracing: |
| |
| * its passcount as given by the `passcount N' command |
| |
| (gdb) info trace |
| Num Type Disp Enb Address What |
| 1 tracepoint keep y 0x0804ab57 in foo() at main.cxx:7 |
| while-stepping 20 |
| collect globfoo, $regs |
| end |
| collect globfoo2 |
| end |
| pass count 1200 |
| (gdb) |
| |
| This command can be abbreviated `info tp'. |
| |
| |
| File: gdb.info, Node: Listing Static Tracepoint Markers, Next: Starting and Stopping Trace Experiments, Prev: Listing Tracepoints, Up: Set Tracepoints |
| |
| 13.1.8 Listing Static Tracepoint Markers |
| ---------------------------------------- |
| |
| `info static-tracepoint-markers' |
| Display information about all static tracepoint markers defined in |
| the program. |
| |
| For each marker, the following columns are printed: |
| |
| _Count_ |
| An incrementing counter, output to help readability. This is |
| not a stable identifier. |
| |
| _ID_ |
| The marker ID, as reported by the target. |
| |
| _Enabled or Disabled_ |
| Probed markers are tagged with `y'. `n' identifies marks |
| that are not enabled. |
| |
| _Address_ |
| Where the marker is in your program, as a memory address. |
| |
| _What_ |
| Where the marker is in the source for your program, as a file |
| and line number. If the debug information included in the |
| program does not allow GDB to locate the source of the |
| marker, this column will be left blank. |
| |
| In addition, the following information may be printed for each |
| marker: |
| |
| _Data_ |
| User data passed to the tracing library by the marker call. |
| In the UST backend, this is the format string passed as |
| argument to the marker call. |
| |
| _Static tracepoints probing the marker_ |
| The list of static tracepoints attached to the marker. |
| |
| (gdb) info static-tracepoint-markers |
| Cnt ID Enb Address What |
| 1 ust/bar2 y 0x0000000000400e1a in main at stexample.c:25 |
| Data: number1 %d number2 %d |
| Probed by static tracepoints: #2 |
| 2 ust/bar33 n 0x0000000000400c87 in main at stexample.c:24 |
| Data: str %s |
| (gdb) |
| |
| |
| File: gdb.info, Node: Starting and Stopping Trace Experiments, Next: Tracepoint Restrictions, Prev: Listing Static Tracepoint Markers, Up: Set Tracepoints |
| |
| 13.1.9 Starting and Stopping Trace Experiments |
| ---------------------------------------------- |
| |
| `tstart' |
| This command takes no arguments. It starts the trace experiment, |
| and begins collecting data. This has the side effect of |
| discarding all the data collected in the trace buffer during the |
| previous trace experiment. |
| |
| `tstop' |
| This command takes no arguments. It ends the trace experiment, and |
| stops collecting data. |
| |
| *Note*: a trace experiment and data collection may stop |
| automatically if any tracepoint's passcount is reached (*note |
| Tracepoint Passcounts::), or if the trace buffer becomes full. |
| |
| `tstatus' |
| This command displays the status of the current trace data |
| collection. |
| |
| Here is an example of the commands we described so far: |
| |
| (gdb) trace gdb_c_test |
| (gdb) actions |
| Enter actions for tracepoint #1, one per line. |
| > collect $regs,$locals,$args |
| > while-stepping 11 |
| > collect $regs |
| > end |
| > end |
| (gdb) tstart |
| [time passes ...] |
| (gdb) tstop |
| |
| You can choose to continue running the trace experiment even if GDB |
| disconnects from the target, voluntarily or involuntarily. For |
| commands such as `detach', the debugger will ask what you want to do |
| with the trace. But for unexpected terminations (GDB crash, network |
| outage), it would be unfortunate to lose hard-won trace data, so the |
| variable `disconnected-tracing' lets you decide whether the trace should |
| continue running without GDB. |
| |
| `set disconnected-tracing on' |
| `set disconnected-tracing off' |
| Choose whether a tracing run should continue to run if GDB has |
| disconnected from the target. Note that `detach' or `quit' will |
| ask you directly what to do about a running trace no matter what |
| this variable's setting, so the variable is mainly useful for |
| handling unexpected situations, such as loss of the network. |
| |
| `show disconnected-tracing' |
| Show the current choice for disconnected tracing. |
| |
| |
| When you reconnect to the target, the trace experiment may or may not |
| still be running; it might have filled the trace buffer in the |
| meantime, or stopped for one of the other reasons. If it is running, |
| it will continue after reconnection. |
| |
| Upon reconnection, the target will upload information about the |
| tracepoints in effect. GDB will then compare that information to the |
| set of tracepoints currently defined, and attempt to match them up, |
| allowing for the possibility that the numbers may have changed due to |
| creation and deletion in the meantime. If one of the target's |
| tracepoints does not match any in GDB, the debugger will create a new |
| tracepoint, so that you have a number with which to specify that |
| tracepoint. This matching-up process is necessarily heuristic, and it |
| may result in useless tracepoints being created; you may simply delete |
| them if they are of no use. |
| |
| If your target agent supports a "circular trace buffer", then you |
| can run a trace experiment indefinitely without filling the trace |
| buffer; when space runs out, the agent deletes already-collected trace |
| frames, oldest first, until there is enough room to continue |
| collecting. This is especially useful if your tracepoints are being |
| hit too often, and your trace gets terminated prematurely because the |
| buffer is full. To ask for a circular trace buffer, simply set |
| `circular_trace_buffer' to on. You can set this at any time, including |
| during tracing; if the agent can do it, it will change buffer handling |
| on the fly, otherwise it will not take effect until the next run. |
| |
| `set circular-trace-buffer on' |
| `set circular-trace-buffer off' |
| Choose whether a tracing run should use a linear or circular buffer |
| for trace data. A linear buffer will not lose any trace data, but |
| may fill up prematurely, while a circular buffer will discard old |
| trace data, but it will have always room for the latest tracepoint |
| hits. |
| |
| `show circular-trace-buffer' |
| Show the current choice for the trace buffer. Note that this may |
| not match the agent's current buffer handling, nor is it |
| guaranteed to match the setting that might have been in effect |
| during a past run, for instance if you are looking at frames from |
| a trace file. |
| |
| |
| |
| File: gdb.info, Node: Tracepoint Restrictions, Prev: Starting and Stopping Trace Experiments, Up: Set Tracepoints |
| |
| 13.1.10 Tracepoint Restrictions |
| ------------------------------- |
| |
| There are a number of restrictions on the use of tracepoints. As |
| described above, tracepoint data gathering occurs on the target without |
| interaction from GDB. Thus the full capabilities of the debugger are |
| not available during data gathering, and then at data examination time, |
| you will be limited by only having what was collected. The following |
| items describe some common problems, but it is not exhaustive, and you |
| may run into additional difficulties not mentioned here. |
| |
| * Tracepoint expressions are intended to gather objects (lvalues). |
| Thus the full flexibility of GDB's expression evaluator is not |
| available. You cannot call functions, cast objects to aggregate |
| types, access convenience variables or modify values (except by |
| assignment to trace state variables). Some language features may |
| implicitly call functions (for instance Objective-C fields with |
| accessors), and therefore cannot be collected either. |
| |
| * Collection of local variables, either individually or in bulk with |
| `$locals' or `$args', during `while-stepping' may behave |
| erratically. The stepping action may enter a new scope (for |
| instance by stepping into a function), or the location of the |
| variable may change (for instance it is loaded into a register). |
| The tracepoint data recorded uses the location information for the |
| variables that is correct for the tracepoint location. When the |
| tracepoint is created, it is not possible, in general, to determine |
| where the steps of a `while-stepping' sequence will advance the |
| program--particularly if a conditional branch is stepped. |
| |
| * Collection of an incompletely-initialized or partially-destroyed |
| object may result in something that GDB cannot display, or displays |
| in a misleading way. |
| |
| * When GDB displays a pointer to character it automatically |
| dereferences the pointer to also display characters of the string |
| being pointed to. However, collecting the pointer during tracing |
| does not automatically collect the string. You need to explicitly |
| dereference the pointer and provide size information if you want to |
| collect not only the pointer, but the memory pointed to. For |
| example, `*ptr@50' can be used to collect the 50 element array |
| pointed to by `ptr'. |
| |
| * It is not possible to collect a complete stack backtrace at a |
| tracepoint. Instead, you may collect the registers and a few |
| hundred bytes from the stack pointer with something like |
| `*$esp@300' (adjust to use the name of the actual stack pointer |
| register on your target architecture, and the amount of stack you |
| wish to capture). Then the `backtrace' command will show a |
| partial backtrace when using a trace frame. The number of stack |
| frames that can be examined depends on the sizes of the frames in |
| the collected stack. Note that if you ask for a block so large |
| that it goes past the bottom of the stack, the target agent may |
| report an error trying to read from an invalid address. |
| |
| * If you do not collect registers at a tracepoint, GDB can infer |
| that the value of `$pc' must be the same as the address of the |
| tracepoint and use that when you are looking at a trace frame for |
| that tracepoint. However, this cannot work if the tracepoint has |
| multiple locations (for instance if it was set in a function that |
| was inlined), or if it has a `while-stepping' loop. In those cases |
| GDB will warn you that it can't infer `$pc', and default it to |
| zero. |
| |
| |
| |
| File: gdb.info, Node: Analyze Collected Data, Next: Tracepoint Variables, Prev: Set Tracepoints, Up: Tracepoints |
| |
| 13.2 Using the Collected Data |
| ============================= |
| |
| After the tracepoint experiment ends, you use GDB commands for |
| examining the trace data. The basic idea is that each tracepoint |
| collects a trace "snapshot" every time it is hit and another snapshot |
| every time it single-steps. All these snapshots are consecutively |
| numbered from zero and go into a buffer, and you can examine them |
| later. The way you examine them is to "focus" on a specific trace |
| snapshot. When the remote stub is focused on a trace snapshot, it will |
| respond to all GDB requests for memory and registers by reading from |
| the buffer which belongs to that snapshot, rather than from _real_ |
| memory or registers of the program being debugged. This means that |
| *all* GDB commands (`print', `info registers', `backtrace', etc.) will |
| behave as if we were currently debugging the program state as it was |
| when the tracepoint occurred. Any requests for data that are not in |
| the buffer will fail. |
| |
| * Menu: |
| |
| * tfind:: How to select a trace snapshot |
| * tdump:: How to display all data for a snapshot |
| * save tracepoints:: How to save tracepoints for a future run |
| |
| |
| File: gdb.info, Node: tfind, Next: tdump, Up: Analyze Collected Data |
| |
| 13.2.1 `tfind N' |
| ---------------- |
| |
| The basic command for selecting a trace snapshot from the buffer is |
| `tfind N', which finds trace snapshot number N, counting from zero. If |
| no argument N is given, the next snapshot is selected. |
| |
| Here are the various forms of using the `tfind' command. |
| |
| `tfind start' |
| Find the first snapshot in the buffer. This is a synonym for |
| `tfind 0' (since 0 is the number of the first snapshot). |
| |
| `tfind none' |
| Stop debugging trace snapshots, resume _live_ debugging. |
| |
| `tfind end' |
| Same as `tfind none'. |
| |
| `tfind' |
| No argument means find the next trace snapshot. |
| |
| `tfind -' |
| Find the previous trace snapshot before the current one. This |
| permits retracing earlier steps. |
| |
| `tfind tracepoint NUM' |
| Find the next snapshot associated with tracepoint NUM. Search |
| proceeds forward from the last examined trace snapshot. If no |
| argument NUM is given, it means find the next snapshot collected |
| for the same tracepoint as the current snapshot. |
| |
| `tfind pc ADDR' |
| Find the next snapshot associated with the value ADDR of the |
| program counter. Search proceeds forward from the last examined |
| trace snapshot. If no argument ADDR is given, it means find the |
| next snapshot with the same value of PC as the current snapshot. |
| |
| `tfind outside ADDR1, ADDR2' |
| Find the next snapshot whose PC is outside the given range of |
| addresses (exclusive). |
| |
| `tfind range ADDR1, ADDR2' |
| Find the next snapshot whose PC is between ADDR1 and ADDR2 |
| (inclusive). |
| |
| `tfind line [FILE:]N' |
| Find the next snapshot associated with the source line N. If the |
| optional argument FILE is given, refer to line N in that source |
| file. Search proceeds forward from the last examined trace |
| snapshot. If no argument N is given, it means find the next line |
| other than the one currently being examined; thus saying `tfind |
| line' repeatedly can appear to have the same effect as stepping |
| from line to line in a _live_ debugging session. |
| |
| The default arguments for the `tfind' commands are specifically |
| designed to make it easy to scan through the trace buffer. For |
| instance, `tfind' with no argument selects the next trace snapshot, and |
| `tfind -' with no argument selects the previous trace snapshot. So, by |
| giving one `tfind' command, and then simply hitting <RET> repeatedly |
| you can examine all the trace snapshots in order. Or, by saying `tfind |
| -' and then hitting <RET> repeatedly you can examine the snapshots in |
| reverse order. The `tfind line' command with no argument selects the |
| snapshot for the next source line executed. The `tfind pc' command with |
| no argument selects the next snapshot with the same program counter |
| (PC) as the current frame. The `tfind tracepoint' command with no |
| argument selects the next trace snapshot collected by the same |
| tracepoint as the current one. |
| |
| In addition to letting you scan through the trace buffer manually, |
| these commands make it easy to construct GDB scripts that scan through |
| the trace buffer and print out whatever collected data you are |
| interested in. Thus, if we want to examine the PC, FP, and SP |
| registers from each trace frame in the buffer, we can say this: |
| |
| (gdb) tfind start |
| (gdb) while ($trace_frame != -1) |
| > printf "Frame %d, PC = %08X, SP = %08X, FP = %08X\n", \ |
| $trace_frame, $pc, $sp, $fp |
| > tfind |
| > end |
| |
| Frame 0, PC = 0020DC64, SP = 0030BF3C, FP = 0030BF44 |
| Frame 1, PC = 0020DC6C, SP = 0030BF38, FP = 0030BF44 |
| Frame 2, PC = 0020DC70, SP = 0030BF34, FP = 0030BF44 |
| Frame 3, PC = 0020DC74, SP = 0030BF30, FP = 0030BF44 |
| Frame 4, PC = 0020DC78, SP = 0030BF2C, FP = 0030BF44 |
| Frame 5, PC = 0020DC7C, SP = 0030BF28, FP = 0030BF44 |
| Frame 6, PC = 0020DC80, SP = 0030BF24, FP = 0030BF44 |
| Frame 7, PC = 0020DC84, SP = 0030BF20, FP = 0030BF44 |
| Frame 8, PC = 0020DC88, SP = 0030BF1C, FP = 0030BF44 |
| Frame 9, PC = 0020DC8E, SP = 0030BF18, FP = 0030BF44 |
| Frame 10, PC = 00203F6C, SP = 0030BE3C, FP = 0030BF14 |
| |
| Or, if we want to examine the variable `X' at each source line in |
| the buffer: |
| |
| (gdb) tfind start |
| (gdb) while ($trace_frame != -1) |
| > printf "Frame %d, X == %d\n", $trace_frame, X |
| > tfind line |
| > end |
| |
| Frame 0, X = 1 |
| Frame 7, X = 2 |
| Frame 13, X = 255 |
| |
| |
| File: gdb.info, Node: tdump, Next: save tracepoints, Prev: tfind, Up: Analyze Collected Data |
| |
| 13.2.2 `tdump' |
| -------------- |
| |
| This command takes no arguments. It prints all the data collected at |
| the current trace snapshot. |
| |
| (gdb) trace 444 |
| (gdb) actions |
| Enter actions for tracepoint #2, one per line: |
| > collect $regs, $locals, $args, gdb_long_test |
| > end |
| |
| (gdb) tstart |
| |
| (gdb) tfind line 444 |
| #0 gdb_test (p1=0x11, p2=0x22, p3=0x33, p4=0x44, p5=0x55, p6=0x66) |
| at gdb_test.c:444 |
| 444 printp( "%s: arguments = 0x%X 0x%X 0x%X 0x%X 0x%X 0x%X\n", ) |
| |
| (gdb) tdump |
| Data collected at tracepoint 2, trace frame 1: |
| d0 0xc4aa0085 -995491707 |
| d1 0x18 24 |
| d2 0x80 128 |
| d3 0x33 51 |
| d4 0x71aea3d 119204413 |
| d5 0x22 34 |
| d6 0xe0 224 |
| d7 0x380035 3670069 |
| a0 0x19e24a 1696330 |
| a1 0x3000668 50333288 |
| a2 0x100 256 |
| a3 0x322000 3284992 |
| a4 0x3000698 50333336 |
| a5 0x1ad3cc 1758156 |
| fp 0x30bf3c 0x30bf3c |
| sp 0x30bf34 0x30bf34 |
| ps 0x0 0 |
| pc 0x20b2c8 0x20b2c8 |
| fpcontrol 0x0 0 |
| fpstatus 0x0 0 |
| fpiaddr 0x0 0 |
| p = 0x20e5b4 "gdb-test" |
| p1 = (void *) 0x11 |
| p2 = (void *) 0x22 |
| p3 = (void *) 0x33 |
| p4 = (void *) 0x44 |
| p5 = (void *) 0x55 |
| p6 = (void *) 0x66 |
| gdb_long_test = 17 '\021' |
| |
| (gdb) |
| |
| `tdump' works by scanning the tracepoint's current collection |
| actions and printing the value of each expression listed. So `tdump' |
| can fail, if after a run, you change the tracepoint's actions to |
| mention variables that were not collected during the run. |
| |
| Also, for tracepoints with `while-stepping' loops, `tdump' uses the |
| collected value of `$pc' to distinguish between trace frames that were |
| collected at the tracepoint hit, and frames that were collected while |
| stepping. This allows it to correctly choose whether to display the |
| basic list of collections, or the collections from the body of the |
| while-stepping loop. However, if `$pc' was not collected, then `tdump' |
| will always attempt to dump using the basic collection list, and may |
| fail if a while-stepping frame does not include all the same data that |
| is collected at the tracepoint hit. |
| |
| |
| File: gdb.info, Node: save tracepoints, Prev: tdump, Up: Analyze Collected Data |
| |
| 13.2.3 `save tracepoints FILENAME' |
| ---------------------------------- |
| |
| This command saves all current tracepoint definitions together with |
| their actions and passcounts, into a file `FILENAME' suitable for use |
| in a later debugging session. To read the saved tracepoint |
| definitions, use the `source' command (*note Command Files::). The |
| `save-tracepoints' command is a deprecated alias for `save tracepoints' |
| |
| |
| File: gdb.info, Node: Tracepoint Variables, Next: Trace Files, Prev: Analyze Collected Data, Up: Tracepoints |
| |
| 13.3 Convenience Variables for Tracepoints |
| ========================================== |
| |
| `(int) $trace_frame' |
| The current trace snapshot (a.k.a. "frame") number, or -1 if no |
| snapshot is selected. |
| |
| `(int) $tracepoint' |
| The tracepoint for the current trace snapshot. |
| |
| `(int) $trace_line' |
| The line number for the current trace snapshot. |
| |
| `(char []) $trace_file' |
| The source file for the current trace snapshot. |
| |
| `(char []) $trace_func' |
| The name of the function containing `$tracepoint'. |
| |
| Note: `$trace_file' is not suitable for use in `printf', use |
| `output' instead. |
| |
| Here's a simple example of using these convenience variables for |
| stepping through all the trace snapshots and printing some of their |
| data. Note that these are not the same as trace state variables, which |
| are managed by the target. |
| |
| (gdb) tfind start |
| |
| (gdb) while $trace_frame != -1 |
| > output $trace_file |
| > printf ", line %d (tracepoint #%d)\n", $trace_line, $tracepoint |
| > tfind |
| > end |
| |
| |
| File: gdb.info, Node: Trace Files, Prev: Tracepoint Variables, Up: Tracepoints |
| |
| 13.4 Using Trace Files |
| ====================== |
| |
| In some situations, the target running a trace experiment may no longer |
| be available; perhaps it crashed, or the hardware was needed for a |
| different activity. To handle these cases, you can arrange to dump the |
| trace data into a file, and later use that file as a source of trace |
| data, via the `target tfile' command. |
| |
| `tsave [ -r ] FILENAME' |
| Save the trace data to FILENAME. By default, this command assumes |
| that FILENAME refers to the host filesystem, so if necessary GDB |
| will copy raw trace data up from the target and then save it. If |
| the target supports it, you can also supply the optional argument |
| `-r' ("remote") to direct the target to save the data directly |
| into FILENAME in its own filesystem, which may be more efficient |
| if the trace buffer is very large. (Note, however, that `target |
| tfile' can only read from files accessible to the host.) |
| |
| `target tfile FILENAME' |
| Use the file named FILENAME as a source of trace data. Commands |
| that examine data work as they do with a live target, but it is not |
| possible to run any new trace experiments. `tstatus' will report |
| the state of the trace run at the moment the data was saved, as |
| well as the current trace frame you are examining. FILENAME must |
| be on a filesystem accessible to the host. |
| |
| |
| |
| File: gdb.info, Node: Overlays, Next: Languages, Prev: Tracepoints, Up: Top |
| |
| 14 Debugging Programs That Use Overlays |
| *************************************** |
| |
| If your program is too large to fit completely in your target system's |
| memory, you can sometimes use "overlays" to work around this problem. |
| GDB provides some support for debugging programs that use overlays. |
| |
| * Menu: |
| |
| * How Overlays Work:: A general explanation of overlays. |
| * Overlay Commands:: Managing overlays in GDB. |
| * Automatic Overlay Debugging:: GDB can find out which overlays are |
| mapped by asking the inferior. |
| * Overlay Sample Program:: A sample program using overlays. |
| |
| |
| File: gdb.info, Node: How Overlays Work, Next: Overlay Commands, Up: Overlays |
| |
| 14.1 How Overlays Work |
| ====================== |
| |
| Suppose you have a computer whose instruction address space is only 64 |
| kilobytes long, but which has much more memory which can be accessed by |
| other means: special instructions, segment registers, or memory |
| management hardware, for example. Suppose further that you want to |
| adapt a program which is larger than 64 kilobytes to run on this system. |
| |
| One solution is to identify modules of your program which are |
| relatively independent, and need not call each other directly; call |
| these modules "overlays". Separate the overlays from the main program, |
| and place their machine code in the larger memory. Place your main |
| program in instruction memory, but leave at least enough space there to |
| hold the largest overlay as well. |
| |
| Now, to call a function located in an overlay, you must first copy |
| that overlay's machine code from the large memory into the space set |
| aside for it in the instruction memory, and then jump to its entry point |
| there. |
| |
| Data Instruction Larger |
| Address Space Address Space Address Space |
| +-----------+ +-----------+ +-----------+ |
| | | | | | | |
| +-----------+ +-----------+ +-----------+<-- overlay 1 |
| | program | | main | .----| overlay 1 | load address |
| | variables | | program | | +-----------+ |
| | and heap | | | | | | |
| +-----------+ | | | +-----------+<-- overlay 2 |
| | | +-----------+ | | | load address |
| +-----------+ | | | .-| overlay 2 | |
| | | | | | | |
| mapped --->+-----------+ | | +-----------+ |
| address | | | | | | |
| | overlay | <-' | | | |
| | area | <---' +-----------+<-- overlay 3 |
| | | <---. | | load address |
| +-----------+ `--| overlay 3 | |
| | | | | |
| +-----------+ | | |
| +-----------+ |
| | | |
| +-----------+ |
| |
| A code overlay |
| |
| The diagram (*note A code overlay::) shows a system with separate |
| data and instruction address spaces. To map an overlay, the program |
| copies its code from the larger address space to the instruction |
| address space. Since the overlays shown here all use the same mapped |
| address, only one may be mapped at a time. For a system with a single |
| address space for data and instructions, the diagram would be similar, |
| except that the program variables and heap would share an address space |
| with the main program and the overlay area. |
| |
| An overlay loaded into instruction memory and ready for use is |
| called a "mapped" overlay; its "mapped address" is its address in the |
| instruction memory. An overlay not present (or only partially present) |
| in instruction memory is called "unmapped"; its "load address" is its |
| address in the larger memory. The mapped address is also called the |
| "virtual memory address", or "VMA"; the load address is also called the |
| "load memory address", or "LMA". |
| |
| Unfortunately, overlays are not a completely transparent way to |
| adapt a program to limited instruction memory. They introduce a new |
| set of global constraints you must keep in mind as you design your |
| program: |
| |
| * Before calling or returning to a function in an overlay, your |
| program must make sure that overlay is actually mapped. |
| Otherwise, the call or return will transfer control to the right |
| address, but in the wrong overlay, and your program will probably |
| crash. |
| |
| * If the process of mapping an overlay is expensive on your system, |
| you will need to choose your overlays carefully to minimize their |
| effect on your program's performance. |
| |
| * The executable file you load onto your system must contain each |
| overlay's instructions, appearing at the overlay's load address, |
| not its mapped address. However, each overlay's instructions must |
| be relocated and its symbols defined as if the overlay were at its |
| mapped address. You can use GNU linker scripts to specify |
| different load and relocation addresses for pieces of your |
| program; see *Note Overlay Description: (ld.info)Overlay |
| Description. |
| |
| * The procedure for loading executable files onto your system must |
| be able to load their contents into the larger address space as |
| well as the instruction and data spaces. |
| |
| |
| The overlay system described above is rather simple, and could be |
| improved in many ways: |
| |
| * If your system has suitable bank switch registers or memory |
| management hardware, you could use those facilities to make an |
| overlay's load area contents simply appear at their mapped address |
| in instruction space. This would probably be faster than copying |
| the overlay to its mapped area in the usual way. |
| |
| * If your overlays are small enough, you could set aside more than |
| one overlay area, and have more than one overlay mapped at a time. |
| |
| * You can use overlays to manage data, as well as instructions. In |
| general, data overlays are even less transparent to your design |
| than code overlays: whereas code overlays only require care when |
| you call or return to functions, data overlays require care every |
| time you access the data. Also, if you change the contents of a |
| data overlay, you must copy its contents back out to its load |
| address before you can copy a different data overlay into the same |
| mapped area. |
| |
| |
| |
| File: gdb.info, Node: Overlay Commands, Next: Automatic Overlay Debugging, Prev: How Overlays Work, Up: Overlays |
| |
| 14.2 Overlay Commands |
| ===================== |
| |
| To use GDB's overlay support, each overlay in your program must |
| correspond to a separate section of the executable file. The section's |
| virtual memory address and load memory address must be the overlay's |
| mapped and load addresses. Identifying overlays with sections allows |
| GDB to determine the appropriate address of a function or variable, |
| depending on whether the overlay is mapped or not. |
| |
| GDB's overlay commands all start with the word `overlay'; you can |
| abbreviate this as `ov' or `ovly'. The commands are: |
| |
| `overlay off' |
| Disable GDB's overlay support. When overlay support is disabled, |
| GDB assumes that all functions and variables are always present at |
| their mapped addresses. By default, GDB's overlay support is |
| disabled. |
| |
| `overlay manual' |
| Enable "manual" overlay debugging. In this mode, GDB relies on |
| you to tell it which overlays are mapped, and which are not, using |
| the `overlay map-overlay' and `overlay unmap-overlay' commands |
| described below. |
| |
| `overlay map-overlay OVERLAY' |
| `overlay map OVERLAY' |
| Tell GDB that OVERLAY is now mapped; OVERLAY must be the name of |
| the object file section containing the overlay. When an overlay |
| is mapped, GDB assumes it can find the overlay's functions and |
| variables at their mapped addresses. GDB assumes that any other |
| overlays whose mapped ranges overlap that of OVERLAY are now |
| unmapped. |
| |
| `overlay unmap-overlay OVERLAY' |
| `overlay unmap OVERLAY' |
| Tell GDB that OVERLAY is no longer mapped; OVERLAY must be the |
| name of the object file section containing the overlay. When an |
| overlay is unmapped, GDB assumes it can find the overlay's |
| functions and variables at their load addresses. |
| |
| `overlay auto' |
| Enable "automatic" overlay debugging. In this mode, GDB consults |
| a data structure the overlay manager maintains in the inferior to |
| see which overlays are mapped. For details, see *Note Automatic |
| Overlay Debugging::. |
| |
| `overlay load-target' |
| `overlay load' |
| Re-read the overlay table from the inferior. Normally, GDB |
| re-reads the table GDB automatically each time the inferior stops, |
| so this command should only be necessary if you have changed the |
| overlay mapping yourself using GDB. This command is only useful |
| when using automatic overlay debugging. |
| |
| `overlay list-overlays' |
| `overlay list' |
| Display a list of the overlays currently mapped, along with their |
| mapped addresses, load addresses, and sizes. |
| |
| |
| Normally, when GDB prints a code address, it includes the name of |
| the function the address falls in: |
| |
| (gdb) print main |
| $3 = {int ()} 0x11a0 <main> |
| When overlay debugging is enabled, GDB recognizes code in unmapped |
| overlays, and prints the names of unmapped functions with asterisks |
| around them. For example, if `foo' is a function in an unmapped |
| overlay, GDB prints it this way: |
| |
| (gdb) overlay list |
| No sections are mapped. |
| (gdb) print foo |
| $5 = {int (int)} 0x100000 <*foo*> |
| When `foo''s overlay is mapped, GDB prints the function's name |
| normally: |
| |
| (gdb) overlay list |
| Section .ov.foo.text, loaded at 0x100000 - 0x100034, |
| mapped at 0x1016 - 0x104a |
| (gdb) print foo |
| $6 = {int (int)} 0x1016 <foo> |
| |
| When overlay debugging is enabled, GDB can find the correct address |
| for functions and variables in an overlay, whether or not the overlay |
| is mapped. This allows most GDB commands, like `break' and |
| `disassemble', to work normally, even on unmapped code. However, GDB's |
| breakpoint support has some limitations: |
| |
| * You can set breakpoints in functions in unmapped overlays, as long |
| as GDB can write to the overlay at its load address. |
| |
| * GDB can not set hardware or simulator-based breakpoints in |
| unmapped overlays. However, if you set a breakpoint at the end of |
| your overlay manager (and tell GDB which overlays are now mapped, |
| if you are using manual overlay management), GDB will re-set its |
| breakpoints properly. |
| |
| |
| File: gdb.info, Node: Automatic Overlay Debugging, Next: Overlay Sample Program, Prev: Overlay Commands, Up: Overlays |
| |
| 14.3 Automatic Overlay Debugging |
| ================================ |
| |
| GDB can automatically track which overlays are mapped and which are |
| not, given some simple co-operation from the overlay manager in the |
| inferior. If you enable automatic overlay debugging with the `overlay |
| auto' command (*note Overlay Commands::), GDB looks in the inferior's |
| memory for certain variables describing the current state of the |
| overlays. |
| |
| Here are the variables your overlay manager must define to support |
| GDB's automatic overlay debugging: |
| |
| `_ovly_table': |
| This variable must be an array of the following structures: |
| |
| struct |
| { |
| /* The overlay's mapped address. */ |
| unsigned long vma; |
| |
| /* The size of the overlay, in bytes. */ |
| unsigned long size; |
| |
| /* The overlay's load address. */ |
| unsigned long lma; |
| |
| /* Non-zero if the overlay is currently mapped; |
| zero otherwise. */ |
| unsigned long mapped; |
| } |
| |
| `_novlys': |
| This variable must be a four-byte signed integer, holding the total |
| number of elements in `_ovly_table'. |
| |
| |
| To decide whether a particular overlay is mapped or not, GDB looks |
| for an entry in `_ovly_table' whose `vma' and `lma' members equal the |
| VMA and LMA of the overlay's section in the executable file. When GDB |
| finds a matching entry, it consults the entry's `mapped' member to |
| determine whether the overlay is currently mapped. |
| |
| In addition, your overlay manager may define a function called |
| `_ovly_debug_event'. If this function is defined, GDB will silently |
| set a breakpoint there. If the overlay manager then calls this |
| function whenever it has changed the overlay table, this will enable |
| GDB to accurately keep track of which overlays are in program memory, |
| and update any breakpoints that may be set in overlays. This will |
| allow breakpoints to work even if the overlays are kept in ROM or other |
| non-writable memory while they are not being executed. |
| |
| |
| File: gdb.info, Node: Overlay Sample Program, Prev: Automatic Overlay Debugging, Up: Overlays |
| |
| 14.4 Overlay Sample Program |
| =========================== |
| |
| When linking a program which uses overlays, you must place the overlays |
| at their load addresses, while relocating them to run at their mapped |
| addresses. To do this, you must write a linker script (*note Overlay |
| Description: (ld.info)Overlay Description.). Unfortunately, since |
| linker scripts are specific to a particular host system, target |
| architecture, and target memory layout, this manual cannot provide |
| portable sample code demonstrating GDB's overlay support. |
| |
| However, the GDB source distribution does contain an overlaid |
| program, with linker scripts for a few systems, as part of its test |
| suite. The program consists of the following files from |
| `gdb/testsuite/gdb.base': |
| |
| `overlays.c' |
| The main program file. |
| |
| `ovlymgr.c' |
| A simple overlay manager, used by `overlays.c'. |
| |
| `foo.c' |
| `bar.c' |
| `baz.c' |
| `grbx.c' |
| Overlay modules, loaded and used by `overlays.c'. |
| |
| `d10v.ld' |
| `m32r.ld' |
| Linker scripts for linking the test program on the `d10v-elf' and |
| `m32r-elf' targets. |
| |
| You can build the test program using the `d10v-elf' GCC |
| cross-compiler like this: |
| |
| $ d10v-elf-gcc -g -c overlays.c |
| $ d10v-elf-gcc -g -c ovlymgr.c |
| $ d10v-elf-gcc -g -c foo.c |
| $ d10v-elf-gcc -g -c bar.c |
| $ d10v-elf-gcc -g -c baz.c |
| $ d10v-elf-gcc -g -c grbx.c |
| $ d10v-elf-gcc -g overlays.o ovlymgr.o foo.o bar.o \ |
| baz.o grbx.o -Wl,-Td10v.ld -o overlays |
| |
| The build process is identical for any other architecture, except |
| that you must substitute the appropriate compiler and linker script for |
| the target system for `d10v-elf-gcc' and `d10v.ld'. |
| |
| |
| File: gdb.info, Node: Languages, Next: Symbols, Prev: Overlays, Up: Top |
| |
| 15 Using GDB with Different Languages |
| ************************************* |
| |
| Although programming languages generally have common aspects, they are |
| rarely expressed in the same manner. For instance, in ANSI C, |
| dereferencing a pointer `p' is accomplished by `*p', but in Modula-2, |
| it is accomplished by `p^'. Values can also be represented (and |
| displayed) differently. Hex numbers in C appear as `0x1ae', while in |
| Modula-2 they appear as `1AEH'. |
| |
| Language-specific information is built into GDB for some languages, |
| allowing you to express operations like the above in your program's |
| native language, and allowing GDB to output values in a manner |
| consistent with the syntax of your program's native language. The |
| language you use to build expressions is called the "working language". |
| |
| * Menu: |
| |
| * Setting:: Switching between source languages |
| * Show:: Displaying the language |
| * Checks:: Type and range checks |
| * Supported Languages:: Supported languages |
| * Unsupported Languages:: Unsupported languages |
| |
| |
| File: gdb.info, Node: Setting, Next: Show, Up: Languages |
| |
| 15.1 Switching Between Source Languages |
| ======================================= |
| |
| There are two ways to control the working language--either have GDB set |
| it automatically, or select it manually yourself. You can use the `set |
| language' command for either purpose. On startup, GDB defaults to |
| setting the language automatically. The working language is used to |
| determine how expressions you type are interpreted, how values are |
| printed, etc. |
| |
| In addition to the working language, every source file that GDB |
| knows about has its own working language. For some object file |
| formats, the compiler might indicate which language a particular source |
| file is in. However, most of the time GDB infers the language from the |
| name of the file. The language of a source file controls whether C++ |
| names are demangled--this way `backtrace' can show each frame |
| appropriately for its own language. There is no way to set the |
| language of a source file from within GDB, but you can set the language |
| associated with a filename extension. *Note Displaying the Language: |
| Show. |
| |
| This is most commonly a problem when you use a program, such as |
| `cfront' or `f2c', that generates C but is written in another language. |
| In that case, make the program use `#line' directives in its C output; |
| that way GDB will know the correct language of the source code of the |
| original program, and will display that source code, not the generated |
| C code. |
| |
| * Menu: |
| |
| * Filenames:: Filename extensions and languages. |
| * Manually:: Setting the working language manually |
| * Automatically:: Having GDB infer the source language |
| |
| |
| File: gdb.info, Node: Filenames, Next: Manually, Up: Setting |
| |
| 15.1.1 List of Filename Extensions and Languages |
| ------------------------------------------------ |
| |
| If a source file name ends in one of the following extensions, then GDB |
| infers that its language is the one indicated. |
| |
| `.ada' |
| `.ads' |
| `.adb' |
| `.a' |
| Ada source file. |
| |
| `.c' |
| C source file |
| |
| `.C' |
| `.cc' |
| `.cp' |
| `.cpp' |
| `.cxx' |
| `.c++' |
| C++ source file |
| |
| `.d' |
| D source file |
| |
| `.m' |
| Objective-C source file |
| |
| `.f' |
| `.F' |
| Fortran source file |
| |
| `.mod' |
| Modula-2 source file |
| |
| `.s' |
| `.S' |
| Assembler source file. This actually behaves almost like C, but |
| GDB does not skip over function prologues when stepping. |
| |
| In addition, you may set the language associated with a filename |
| extension. *Note Displaying the Language: Show. |
| |
| |
| File: gdb.info, Node: Manually, Next: Automatically, Prev: Filenames, Up: Setting |
| |
| 15.1.2 Setting the Working Language |
| ----------------------------------- |
| |
| If you allow GDB to set the language automatically, expressions are |
| interpreted the same way in your debugging session and your program. |
| |
| If you wish, you may set the language manually. To do this, issue |
| the command `set language LANG', where LANG is the name of a language, |
| such as `c' or `modula-2'. For a list of the supported languages, type |
| `set language'. |
| |
| Setting the language manually prevents GDB from updating the working |
| language automatically. This can lead to confusion if you try to debug |
| a program when the working language is not the same as the source |
| language, when an expression is acceptable to both languages--but means |
| different things. For instance, if the current source file were |
| written in C, and GDB was parsing Modula-2, a command such as: |
| |
| print a = b + c |
| |
| might not have the effect you intended. In C, this means to add `b' |
| and `c' and place the result in `a'. The result printed would be the |
| value of `a'. In Modula-2, this means to compare `a' to the result of |
| `b+c', yielding a `BOOLEAN' value. |
| |
| |
| File: gdb.info, Node: Automatically, Prev: Manually, Up: Setting |
| |
| 15.1.3 Having GDB Infer the Source Language |
| ------------------------------------------- |
| |
| To have GDB set the working language automatically, use `set language |
| local' or `set language auto'. GDB then infers the working language. |
| That is, when your program stops in a frame (usually by encountering a |
| breakpoint), GDB sets the working language to the language recorded for |
| the function in that frame. If the language for a frame is unknown |
| (that is, if the function or block corresponding to the frame was |
| defined in a source file that does not have a recognized extension), |
| the current working language is not changed, and GDB issues a warning. |
| |
| This may not seem necessary for most programs, which are written |
| entirely in one source language. However, program modules and libraries |
| written in one source language can be used by a main program written in |
| a different source language. Using `set language auto' in this case |
| frees you from having to set the working language manually. |
| |
| |
| File: gdb.info, Node: Show, Next: Checks, Prev: Setting, Up: Languages |
| |
| 15.2 Displaying the Language |
| ============================ |
| |
| The following commands help you find out which language is the working |
| language, and also what language source files were written in. |
| |
| `show language' |
| Display the current working language. This is the language you |
| can use with commands such as `print' to build and compute |
| expressions that may involve variables in your program. |
| |
| `info frame' |
| Display the source language for this frame. This language becomes |
| the working language if you use an identifier from this frame. |
| *Note Information about a Frame: Frame Info, to identify the other |
| information listed here. |
| |
| `info source' |
| Display the source language of this source file. *Note Examining |
| the Symbol Table: Symbols, to identify the other information |
| listed here. |
| |
| In unusual circumstances, you may have source files with extensions |
| not in the standard list. You can then set the extension associated |
| with a language explicitly: |
| |
| `set extension-language EXT LANGUAGE' |
| Tell GDB that source files with extension EXT are to be assumed as |
| written in the source language LANGUAGE. |
| |
| `info extensions' |
| List all the filename extensions and the associated languages. |
| |
| |
| File: gdb.info, Node: Checks, Next: Supported Languages, Prev: Show, Up: Languages |
| |
| 15.3 Type and Range Checking |
| ============================ |
| |
| _Warning:_ In this release, the GDB commands for type and range |
| checking are included, but they do not yet have any effect. This |
| section documents the intended facilities. |
| |
| Some languages are designed to guard you against making seemingly |
| common errors through a series of compile- and run-time checks. These |
| include checking the type of arguments to functions and operators, and |
| making sure mathematical overflows are caught at run time. Checks such |
| as these help to ensure a program's correctness once it has been |
| compiled by eliminating type mismatches, and providing active checks |
| for range errors when your program is running. |
| |
| GDB can check for conditions like the above if you wish. Although |
| GDB does not check the statements in your program, it can check |
| expressions entered directly into GDB for evaluation via the `print' |
| command, for example. As with the working language, GDB can also |
| decide whether or not to check automatically based on your program's |
| source language. *Note Supported Languages: Supported Languages, for |
| the default settings of supported languages. |
| |
| * Menu: |
| |
| * Type Checking:: An overview of type checking |
| * Range Checking:: An overview of range checking |
| |
| |
| File: gdb.info, Node: Type Checking, Next: Range Checking, Up: Checks |
| |
| 15.3.1 An Overview of Type Checking |
| ----------------------------------- |
| |
| Some languages, such as Modula-2, are strongly typed, meaning that the |
| arguments to operators and functions have to be of the correct type, |
| otherwise an error occurs. These checks prevent type mismatch errors |
| from ever causing any run-time problems. For example, |
| |
| 1 + 2 => 3 |
| but |
| error--> 1 + 2.3 |
| |
| The second example fails because the `CARDINAL' 1 is not |
| type-compatible with the `REAL' 2.3. |
| |
| For the expressions you use in GDB commands, you can tell the GDB |
| type checker to skip checking; to treat any mismatches as errors and |
| abandon the expression; or to only issue warnings when type mismatches |
| occur, but evaluate the expression anyway. When you choose the last of |
| these, GDB evaluates expressions like the second example above, but |
| also issues a warning. |
| |
| Even if you turn type checking off, there may be other reasons |
| related to type that prevent GDB from evaluating an expression. For |
| instance, GDB does not know how to add an `int' and a `struct foo'. |
| These particular type errors have nothing to do with the language in |
| use, and usually arise from expressions, such as the one described |
| above, which make little sense to evaluate anyway. |
| |
| Each language defines to what degree it is strict about type. For |
| instance, both Modula-2 and C require the arguments to arithmetical |
| operators to be numbers. In C, enumerated types and pointers can be |
| represented as numbers, so that they are valid arguments to mathematical |
| operators. *Note Supported Languages: Supported Languages, for further |
| details on specific languages. |
| |
| GDB provides some additional commands for controlling the type |
| checker: |
| |
| `set check type auto' |
| Set type checking on or off based on the current working language. |
| *Note Supported Languages: Supported Languages, for the default |
| settings for each language. |
| |
| `set check type on' |
| `set check type off' |
| Set type checking on or off, overriding the default setting for the |
| current working language. Issue a warning if the setting does not |
| match the language default. If any type mismatches occur in |
| evaluating an expression while type checking is on, GDB prints a |
| message and aborts evaluation of the expression. |
| |
| `set check type warn' |
| Cause the type checker to issue warnings, but to always attempt to |
| evaluate the expression. Evaluating the expression may still be |
| impossible for other reasons. For example, GDB cannot add numbers |
| and structures. |
| |
| `show type' |
| Show the current setting of the type checker, and whether or not |
| GDB is setting it automatically. |
| |
| |
| File: gdb.info, Node: Range Checking, Prev: Type Checking, Up: Checks |
| |
| 15.3.2 An Overview of Range Checking |
| ------------------------------------ |
| |
| In some languages (such as Modula-2), it is an error to exceed the |
| bounds of a type; this is enforced with run-time checks. Such range |
| checking is meant to ensure program correctness by making sure |
| computations do not overflow, or indices on an array element access do |
| not exceed the bounds of the array. |
| |
| For expressions you use in GDB commands, you can tell GDB to treat |
| range errors in one of three ways: ignore them, always treat them as |
| errors and abandon the expression, or issue warnings but evaluate the |
| expression anyway. |
| |
| A range error can result from numerical overflow, from exceeding an |
| array index bound, or when you type a constant that is not a member of |
| any type. Some languages, however, do not treat overflows as an error. |
| In many implementations of C, mathematical overflow causes the result |
| to "wrap around" to lower values--for example, if M is the largest |
| integer value, and S is the smallest, then |
| |
| M + 1 => S |
| |
| This, too, is specific to individual languages, and in some cases |
| specific to individual compilers or machines. *Note Supported |
| Languages: Supported Languages, for further details on specific |
| languages. |
| |
| GDB provides some additional commands for controlling the range |
| checker: |
| |
| `set check range auto' |
| Set range checking on or off based on the current working language. |
| *Note Supported Languages: Supported Languages, for the default |
| settings for each language. |
| |
| `set check range on' |
| `set check range off' |
| Set range checking on or off, overriding the default setting for |
| the current working language. A warning is issued if the setting |
| does not match the language default. If a range error occurs and |
| range checking is on, then a message is printed and evaluation of |
| the expression is aborted. |
| |
| `set check range warn' |
| Output messages when the GDB range checker detects a range error, |
| but attempt to evaluate the expression anyway. Evaluating the |
| expression may still be impossible for other reasons, such as |
| accessing memory that the process does not own (a typical example |
| from many Unix systems). |
| |
| `show range' |
| Show the current setting of the range checker, and whether or not |
| it is being set automatically by GDB. |
| |
| |
| File: gdb.info, Node: Supported Languages, Next: Unsupported Languages, Prev: Checks, Up: Languages |
| |
| 15.4 Supported Languages |
| ======================== |
| |
| GDB supports C, C++, D, Objective-C, Fortran, Java, Pascal, assembly, |
| Modula-2, and Ada. Some GDB features may be used in expressions |
| regardless of the language you use: the GDB `@' and `::' operators, and |
| the `{type}addr' construct (*note Expressions: Expressions.) can be |
| used with the constructs of any supported language. |
| |
| The following sections detail to what degree each source language is |
| supported by GDB. These sections are not meant to be language |
| tutorials or references, but serve only as a reference guide to what the |
| GDB expression parser accepts, and what input and output formats should |
| look like for different languages. There are many good books written |
| on each of these languages; please look to these for a language |
| reference or tutorial. |
| |
| * Menu: |
| |
| * C:: C and C++ |
| * D:: D |
| * Objective-C:: Objective-C |
| * Fortran:: Fortran |
| * Pascal:: Pascal |
| * Modula-2:: Modula-2 |
| * Ada:: Ada |
| |
| |
| File: gdb.info, Node: C, Next: D, Up: Supported Languages |
| |
| 15.4.1 C and C++ |
| ---------------- |
| |
| Since C and C++ are so closely related, many features of GDB apply to |
| both languages. Whenever this is the case, we discuss those languages |
| together. |
| |
| The C++ debugging facilities are jointly implemented by the C++ |
| compiler and GDB. Therefore, to debug your C++ code effectively, you |
| must compile your C++ programs with a supported C++ compiler, such as |
| GNU `g++', or the HP ANSI C++ compiler (`aCC'). |
| |
| For best results when using GNU C++, use the DWARF 2 debugging |
| format; if it doesn't work on your system, try the stabs+ debugging |
| format. You can select those formats explicitly with the `g++' |
| command-line options `-gdwarf-2' and `-gstabs+'. *Note Options for |
| Debugging Your Program or GCC: (gcc.info)Debugging Options. |
| |
| * Menu: |
| |
| * C Operators:: C and C++ operators |
| * C Constants:: C and C++ constants |
| * C Plus Plus Expressions:: C++ expressions |
| * C Defaults:: Default settings for C and C++ |
| * C Checks:: C and C++ type and range checks |
| * Debugging C:: GDB and C |
| * Debugging C Plus Plus:: GDB features for C++ |
| * Decimal Floating Point:: Numbers in Decimal Floating Point format |
| |
| |
| File: gdb.info, Node: C Operators, Next: C Constants, Up: C |
| |
| 15.4.1.1 C and C++ Operators |
| ............................ |
| |
| Operators must be defined on values of specific types. For instance, |
| `+' is defined on numbers, but not on structures. Operators are often |
| defined on groups of types. |
| |
| For the purposes of C and C++, the following definitions hold: |
| |
| * _Integral types_ include `int' with any of its storage-class |
| specifiers; `char'; `enum'; and, for C++, `bool'. |
| |
| * _Floating-point types_ include `float', `double', and `long |
| double' (if supported by the target platform). |
| |
| * _Pointer types_ include all types defined as `(TYPE *)'. |
| |
| * _Scalar types_ include all of the above. |
| |
| |
| The following operators are supported. They are listed here in order |
| of increasing precedence: |
| |
| `,' |
| The comma or sequencing operator. Expressions in a |
| comma-separated list are evaluated from left to right, with the |
| result of the entire expression being the last expression |
| evaluated. |
| |
| `=' |
| Assignment. The value of an assignment expression is the value |
| assigned. Defined on scalar types. |
| |
| `OP=' |
| Used in an expression of the form `A OP= B', and translated to |
| `A = A OP B'. `OP=' and `=' have the same precedence. OP is any |
| one of the operators `|', `^', `&', `<<', `>>', `+', `-', `*', |
| `/', `%'. |
| |
| `?:' |
| The ternary operator. `A ? B : C' can be thought of as: if A |
| then B else C. A should be of an integral type. |
| |
| `||' |
| Logical OR. Defined on integral types. |
| |
| `&&' |
| Logical AND. Defined on integral types. |
| |
| `|' |
| Bitwise OR. Defined on integral types. |
| |
| `^' |
| Bitwise exclusive-OR. Defined on integral types. |
| |
| `&' |
| Bitwise AND. Defined on integral types. |
| |
| `==, !=' |
| Equality and inequality. Defined on scalar types. The value of |
| these expressions is 0 for false and non-zero for true. |
| |
| `<, >, <=, >=' |
| Less than, greater than, less than or equal, greater than or equal. |
| Defined on scalar types. The value of these expressions is 0 for |
| false and non-zero for true. |
| |
| `<<, >>' |
| left shift, and right shift. Defined on integral types. |
| |
| `@' |
| The GDB "artificial array" operator (*note Expressions: |
| Expressions.). |
| |
| `+, -' |
| Addition and subtraction. Defined on integral types, |
| floating-point types and pointer types. |
| |
| `*, /, %' |
| Multiplication, division, and modulus. Multiplication and |
| division are defined on integral and floating-point types. |
| Modulus is defined on integral types. |
| |
| `++, --' |
| Increment and decrement. When appearing before a variable, the |
| operation is performed before the variable is used in an |
| expression; when appearing after it, the variable's value is used |
| before the operation takes place. |
| |
| `*' |
| Pointer dereferencing. Defined on pointer types. Same precedence |
| as `++'. |
| |
| `&' |
| Address operator. Defined on variables. Same precedence as `++'. |
| |
| For debugging C++, GDB implements a use of `&' beyond what is |
| allowed in the C++ language itself: you can use `&(&REF)' to |
| examine the address where a C++ reference variable (declared with |
| `&REF') is stored. |
| |
| `-' |
| Negative. Defined on integral and floating-point types. Same |
| precedence as `++'. |
| |
| `!' |
| Logical negation. Defined on integral types. Same precedence as |
| `++'. |
| |
| `~' |
| Bitwise complement operator. Defined on integral types. Same |
| precedence as `++'. |
| |
| `., ->' |
| Structure member, and pointer-to-structure member. For |
| convenience, GDB regards the two as equivalent, choosing whether |
| to dereference a pointer based on the stored type information. |
| Defined on `struct' and `union' data. |
| |
| `.*, ->*' |
| Dereferences of pointers to members. |
| |
| `[]' |
| Array indexing. `A[I]' is defined as `*(A+I)'. Same precedence |
| as `->'. |
| |
| `()' |
| Function parameter list. Same precedence as `->'. |
| |
| `::' |
| C++ scope resolution operator. Defined on `struct', `union', and |
| `class' types. |
| |
| `::' |
| Doubled colons also represent the GDB scope operator (*note |
| Expressions: Expressions.). Same precedence as `::', above. |
| |
| If an operator is redefined in the user code, GDB usually attempts |
| to invoke the redefined version instead of using the operator's |
| predefined meaning. |
| |
| |
| File: gdb.info, Node: C Constants, Next: C Plus Plus Expressions, Prev: C Operators, Up: C |
| |
| 15.4.1.2 C and C++ Constants |
| ............................ |
| |
| GDB allows you to express the constants of C and C++ in the following |
| ways: |
| |
| * Integer constants are a sequence of digits. Octal constants are |
| specified by a leading `0' (i.e. zero), and hexadecimal constants |
| by a leading `0x' or `0X'. Constants may also end with a letter |
| `l', specifying that the constant should be treated as a `long' |
| value. |
| |
| * Floating point constants are a sequence of digits, followed by a |
| decimal point, followed by a sequence of digits, and optionally |
| followed by an exponent. An exponent is of the form: |
| `e[[+]|-]NNN', where NNN is another sequence of digits. The `+' |
| is optional for positive exponents. A floating-point constant may |
| also end with a letter `f' or `F', specifying that the constant |
| should be treated as being of the `float' (as opposed to the |
| default `double') type; or with a letter `l' or `L', which |
| specifies a `long double' constant. |
| |
| * Enumerated constants consist of enumerated identifiers, or their |
| integral equivalents. |
| |
| * Character constants are a single character surrounded by single |
| quotes (`''), or a number--the ordinal value of the corresponding |
| character (usually its ASCII value). Within quotes, the single |
| character may be represented by a letter or by "escape sequences", |
| which are of the form `\NNN', where NNN is the octal representation |
| of the character's ordinal value; or of the form `\X', where `X' |
| is a predefined special character--for example, `\n' for newline. |
| |
| * String constants are a sequence of character constants surrounded |
| by double quotes (`"'). Any valid character constant (as described |
| above) may appear. Double quotes within the string must be |
| preceded by a backslash, so for instance `"a\"b'c"' is a string of |
| five characters. |
| |
| * Pointer constants are an integral value. You can also write |
| pointers to constants using the C operator `&'. |
| |
| * Array constants are comma-separated lists surrounded by braces `{' |
| and `}'; for example, `{1,2,3}' is a three-element array of |
| integers, `{{1,2}, {3,4}, {5,6}}' is a three-by-two array, and |
| `{&"hi", &"there", &"fred"}' is a three-element array of pointers. |
| |
| |
| File: gdb.info, Node: C Plus Plus Expressions, Next: C Defaults, Prev: C Constants, Up: C |
| |
| 15.4.1.3 C++ Expressions |
| ........................ |
| |
| GDB expression handling can interpret most C++ expressions. |
| |
| _Warning:_ GDB can only debug C++ code if you use the proper |
| compiler and the proper debug format. Currently, GDB works best |
| when debugging C++ code that is compiled with GCC 2.95.3 or with |
| GCC 3.1 or newer, using the options `-gdwarf-2' or `-gstabs+'. |
| DWARF 2 is preferred over stabs+. Most configurations of GCC emit |
| either DWARF 2 or stabs+ as their default debug format, so you |
| usually don't need to specify a debug format explicitly. Other |
| compilers and/or debug formats are likely to work badly or not at |
| all when using GDB to debug C++ code. |
| |
| 1. Member function calls are allowed; you can use expressions like |
| |
| count = aml->GetOriginal(x, y) |
| |
| 2. While a member function is active (in the selected stack frame), |
| your expressions have the same namespace available as the member |
| function; that is, GDB allows implicit references to the class |
| instance pointer `this' following the same rules as C++. |
| |
| 3. You can call overloaded functions; GDB resolves the function call |
| to the right definition, with some restrictions. GDB does not |
| perform overload resolution involving user-defined type |
| conversions, calls to constructors, or instantiations of templates |
| that do not exist in the program. It also cannot handle ellipsis |
| argument lists or default arguments. |
| |
| It does perform integral conversions and promotions, floating-point |
| promotions, arithmetic conversions, pointer conversions, |
| conversions of class objects to base classes, and standard |
| conversions such as those of functions or arrays to pointers; it |
| requires an exact match on the number of function arguments. |
| |
| Overload resolution is always performed, unless you have specified |
| `set overload-resolution off'. *Note GDB Features for C++: |
| Debugging C Plus Plus. |
| |
| You must specify `set overload-resolution off' in order to use an |
| explicit function signature to call an overloaded function, as in |
| p 'foo(char,int)'('x', 13) |
| |
| The GDB command-completion facility can simplify this; see *Note |
| Command Completion: Completion. |
| |
| 4. GDB understands variables declared as C++ references; you can use |
| them in expressions just as you do in C++ source--they are |
| automatically dereferenced. |
| |
| In the parameter list shown when GDB displays a frame, the values |
| of reference variables are not displayed (unlike other variables); |
| this avoids clutter, since references are often used for large |
| structures. The _address_ of a reference variable is always |
| shown, unless you have specified `set print address off'. |
| |
| 5. GDB supports the C++ name resolution operator `::'--your |
| expressions can use it just as expressions in your program do. |
| Since one scope may be defined in another, you can use `::' |
| repeatedly if necessary, for example in an expression like |
| `SCOPE1::SCOPE2::NAME'. GDB also allows resolving name scope by |
| reference to source files, in both C and C++ debugging (*note |
| Program Variables: Variables.). |
| |
| In addition, when used with HP's C++ compiler, GDB supports calling |
| virtual functions correctly, printing out virtual bases of objects, |
| calling functions in a base subobject, casting objects, and invoking |
| user-defined operators. |
| |
| |
| File: gdb.info, Node: C Defaults, Next: C Checks, Prev: C Plus Plus Expressions, Up: C |
| |
| 15.4.1.4 C and C++ Defaults |
| ........................... |
| |
| If you allow GDB to set type and range checking automatically, they |
| both default to `off' whenever the working language changes to C or |
| C++. This happens regardless of whether you or GDB selects the working |
| language. |
| |
| If you allow GDB to set the language automatically, it recognizes |
| source files whose names end with `.c', `.C', or `.cc', etc, and when |
| GDB enters code compiled from one of these files, it sets the working |
| language to C or C++. *Note Having GDB Infer the Source Language: |
| Automatically, for further details. |
| |
| |
| File: gdb.info, Node: C Checks, Next: Debugging C, Prev: C Defaults, Up: C |
| |
| 15.4.1.5 C and C++ Type and Range Checks |
| ........................................ |
| |
| By default, when GDB parses C or C++ expressions, type checking is not |
| used. However, if you turn type checking on, GDB considers two |
| variables type equivalent if: |
| |
| * The two variables are structured and have the same structure, |
| union, or enumerated tag. |
| |
| * The two variables have the same type name, or types that have been |
| declared equivalent through `typedef'. |
| |
| |
| Range checking, if turned on, is done on mathematical operations. |
| Array indices are not checked, since they are often used to index a |
| pointer that is not itself an array. |
| |
| |
| File: gdb.info, Node: Debugging C, Next: Debugging C Plus Plus, Prev: C Checks, Up: C |
| |
| 15.4.1.6 GDB and C |
| .................. |
| |
| The `set print union' and `show print union' commands apply to the |
| `union' type. When set to `on', any `union' that is inside a `struct' |
| or `class' is also printed. Otherwise, it appears as `{...}'. |
| |
| The `@' operator aids in the debugging of dynamic arrays, formed |
| with pointers and a memory allocation function. *Note Expressions: |
| Expressions. |
| |
| |
| File: gdb.info, Node: Debugging C Plus Plus, Next: Decimal Floating Point, Prev: Debugging C, Up: C |
| |
| 15.4.1.7 GDB Features for C++ |
| ............................. |
| |
| Some GDB commands are particularly useful with C++, and some are |
| designed specifically for use with C++. Here is a summary: |
| |
| `breakpoint menus' |
| When you want a breakpoint in a function whose name is overloaded, |
| GDB has the capability to display a menu of possible breakpoint |
| locations to help you specify which function definition you want. |
| *Note Ambiguous Expressions: Ambiguous Expressions. |
| |
| `rbreak REGEX' |
| Setting breakpoints using regular expressions is helpful for |
| setting breakpoints on overloaded functions that are not members |
| of any special classes. *Note Setting Breakpoints: Set Breaks. |
| |
| `catch throw' |
| `catch catch' |
| Debug C++ exception handling using these commands. *Note Setting |
| Catchpoints: Set Catchpoints. |
| |
| `ptype TYPENAME' |
| Print inheritance relationships as well as other information for |
| type TYPENAME. *Note Examining the Symbol Table: Symbols. |
| |
| `set print demangle' |
| `show print demangle' |
| `set print asm-demangle' |
| `show print asm-demangle' |
| Control whether C++ symbols display in their source form, both when |
| displaying code as C++ source and when displaying disassemblies. |
| *Note Print Settings: Print Settings. |
| |
| `set print object' |
| `show print object' |
| Choose whether to print derived (actual) or declared types of |
| objects. *Note Print Settings: Print Settings. |
| |
| `set print vtbl' |
| `show print vtbl' |
| Control the format for printing virtual function tables. *Note |
| Print Settings: Print Settings. (The `vtbl' commands do not work |
| on programs compiled with the HP ANSI C++ compiler (`aCC').) |
| |
| `set overload-resolution on' |
| Enable overload resolution for C++ expression evaluation. The |
| default is on. For overloaded functions, GDB evaluates the |
| arguments and searches for a function whose signature matches the |
| argument types, using the standard C++ conversion rules (see *Note |
| C++ Expressions: C Plus Plus Expressions, for details). If it |
| cannot find a match, it emits a message. |
| |
| `set overload-resolution off' |
| Disable overload resolution for C++ expression evaluation. For |
| overloaded functions that are not class member functions, GDB |
| chooses the first function of the specified name that it finds in |
| the symbol table, whether or not its arguments are of the correct |
| type. For overloaded functions that are class member functions, |
| GDB searches for a function whose signature _exactly_ matches the |
| argument types. |
| |
| `show overload-resolution' |
| Show the current setting of overload resolution. |
| |
| `Overloaded symbol names' |
| You can specify a particular definition of an overloaded symbol, |
| using the same notation that is used to declare such symbols in |
| C++: type `SYMBOL(TYPES)' rather than just SYMBOL. You can also |
| use the GDB command-line word completion facilities to list the |
| available choices, or to finish the type list for you. *Note |
| Command Completion: Completion, for details on how to do this. |
| |
| |
| File: gdb.info, Node: Decimal Floating Point, Prev: Debugging C Plus Plus, Up: C |
| |
| 15.4.1.8 Decimal Floating Point format |
| ...................................... |
| |
| GDB can examine, set and perform computations with numbers in decimal |
| floating point format, which in the C language correspond to the |
| `_Decimal32', `_Decimal64' and `_Decimal128' types as specified by the |
| extension to support decimal floating-point arithmetic. |
| |
| There are two encodings in use, depending on the architecture: BID |
| (Binary Integer Decimal) for x86 and x86-64, and DPD (Densely Packed |
| Decimal) for PowerPC. GDB will use the appropriate encoding for the |
| configured target. |
| |
| Because of a limitation in `libdecnumber', the library used by GDB |
| to manipulate decimal floating point numbers, it is not possible to |
| convert (using a cast, for example) integers wider than 32-bit to |
| decimal float. |
| |
| In addition, in order to imitate GDB's behaviour with binary floating |
| point computations, error checking in decimal float operations ignores |
| underflow, overflow and divide by zero exceptions. |
| |
| In the PowerPC architecture, GDB provides a set of pseudo-registers |
| to inspect `_Decimal128' values stored in floating point registers. |
| See *Note PowerPC: PowerPC. for more details. |
| |
| |
| File: gdb.info, Node: D, Next: Objective-C, Prev: C, Up: Supported Languages |
| |
| 15.4.2 D |
| -------- |
| |
| GDB can be used to debug programs written in D and compiled with GDC, |
| LDC or DMD compilers. Currently GDB supports only one D specific |
| feature -- dynamic arrays. |
| |
| |
| File: gdb.info, Node: Objective-C, Next: Fortran, Prev: D, Up: Supported Languages |
| |
| 15.4.3 Objective-C |
| ------------------ |
| |
| This section provides information about some commands and command |
| options that are useful for debugging Objective-C code. See also *Note |
| info classes: Symbols, and *Note info selectors: Symbols, for a few |
| more commands specific to Objective-C support. |
| |
| * Menu: |
| |
| * Method Names in Commands:: |
| * The Print Command with Objective-C:: |
| |
| |
| File: gdb.info, Node: Method Names in Commands, Next: The Print Command with Objective-C, Up: Objective-C |
| |
| 15.4.3.1 Method Names in Commands |
| ................................. |
| |
| The following commands have been extended to accept Objective-C method |
| names as line specifications: |
| |
| * `clear' |
| |
| * `break' |
| |
| * `info line' |
| |
| * `jump' |
| |
| * `list' |
| |
| A fully qualified Objective-C method name is specified as |
| |
| -[CLASS METHODNAME] |
| |
| where the minus sign is used to indicate an instance method and a |
| plus sign (not shown) is used to indicate a class method. The class |
| name CLASS and method name METHODNAME are enclosed in brackets, similar |
| to the way messages are specified in Objective-C source code. For |
| example, to set a breakpoint at the `create' instance method of class |
| `Fruit' in the program currently being debugged, enter: |
| |
| break -[Fruit create] |
| |
| To list ten program lines around the `initialize' class method, |
| enter: |
| |
| list +[NSText initialize] |
| |
| In the current version of GDB, the plus or minus sign is required. |
| In future versions of GDB, the plus or minus sign will be optional, but |
| you can use it to narrow the search. It is also possible to specify |
| just a method name: |
| |
| break create |
| |
| You must specify the complete method name, including any colons. If |
| your program's source files contain more than one `create' method, |
| you'll be presented with a numbered list of classes that implement that |
| method. Indicate your choice by number, or type `0' to exit if none |
| apply. |
| |
| As another example, to clear a breakpoint established at the |
| `makeKeyAndOrderFront:' method of the `NSWindow' class, enter: |
| |
| clear -[NSWindow makeKeyAndOrderFront:] |
| |
| |
| File: gdb.info, Node: The Print Command with Objective-C, Prev: Method Names in Commands, Up: Objective-C |
| |
| 15.4.3.2 The Print Command With Objective-C |
| ........................................... |
| |
| The print command has also been extended to accept methods. For |
| example: |
| |
| print -[OBJECT hash] |
| |
| will tell GDB to send the `hash' message to OBJECT and print the |
| result. Also, an additional command has been added, `print-object' or |
| `po' for short, which is meant to print the description of an object. |
| However, this command may only work with certain Objective-C libraries |
| that have a particular hook function, `_NSPrintForDebugger', defined. |
| |
| |
| File: gdb.info, Node: Fortran, Next: Pascal, Prev: Objective-C, Up: Supported Languages |
| |
| 15.4.4 Fortran |
| -------------- |
| |
| GDB can be used to debug programs written in Fortran, but it currently |
| supports only the features of Fortran 77 language. |
| |
| Some Fortran compilers (GNU Fortran 77 and Fortran 95 compilers |
| among them) append an underscore to the names of variables and |
| functions. When you debug programs compiled by those compilers, you |
| will need to refer to variables and functions with a trailing |
| underscore. |
| |
| * Menu: |
| |
| * Fortran Operators:: Fortran operators and expressions |
| * Fortran Defaults:: Default settings for Fortran |
| * Special Fortran Commands:: Special GDB commands for Fortran |
| |
| |
| File: gdb.info, Node: Fortran Operators, Next: Fortran Defaults, Up: Fortran |
| |
| 15.4.4.1 Fortran Operators and Expressions |
| .......................................... |
| |
| Operators must be defined on values of specific types. For instance, |
| `+' is defined on numbers, but not on characters or other non- |
| arithmetic types. Operators are often defined on groups of types. |
| |
| `**' |
| The exponentiation operator. It raises the first operand to the |
| power of the second one. |
| |
| `:' |
| The range operator. Normally used in the form of array(low:high) |
| to represent a section of array. |
| |
| `%' |
| The access component operator. Normally used to access elements |
| in derived types. Also suitable for unions. As unions aren't |
| part of regular Fortran, this can only happen when accessing a |
| register that uses a gdbarch-defined union type. |
| |
| |
| File: gdb.info, Node: Fortran Defaults, Next: Special Fortran Commands, Prev: Fortran Operators, Up: Fortran |
| |
| 15.4.4.2 Fortran Defaults |
| ......................... |
| |
| Fortran symbols are usually case-insensitive, so GDB by default uses |
| case-insensitive matches for Fortran symbols. You can change that with |
| the `set case-insensitive' command, see *Note Symbols::, for the |
| details. |
| |
| |
| File: gdb.info, Node: Special Fortran Commands, Prev: Fortran Defaults, Up: Fortran |
| |
| 15.4.4.3 Special Fortran Commands |
| ................................. |
| |
| GDB has some commands to support Fortran-specific features, such as |
| displaying common blocks. |
| |
| `info common [COMMON-NAME]' |
| This command prints the values contained in the Fortran `COMMON' |
| block whose name is COMMON-NAME. With no argument, the names of |
| all `COMMON' blocks visible at the current program location are |
| printed. |
| |
| |
| File: gdb.info, Node: Pascal, Next: Modula-2, Prev: Fortran, Up: Supported Languages |
| |
| 15.4.5 Pascal |
| ------------- |
| |
| Debugging Pascal programs which use sets, subranges, file variables, or |
| nested functions does not currently work. GDB does not support |
| entering expressions, printing values, or similar features using Pascal |
| syntax. |
| |
| The Pascal-specific command `set print pascal_static-members' |
| controls whether static members of Pascal objects are displayed. *Note |
| pascal_static-members: Print Settings. |
| |
| |
| File: gdb.info, Node: Modula-2, Next: Ada, Prev: Pascal, Up: Supported Languages |
| |
| 15.4.6 Modula-2 |
| --------------- |
| |
| The extensions made to GDB to support Modula-2 only support output from |
| the GNU Modula-2 compiler (which is currently being developed). Other |
| Modula-2 compilers are not currently supported, and attempting to debug |
| executables produced by them is most likely to give an error as GDB |
| reads in the executable's symbol table. |
| |
| * Menu: |
| |
| * M2 Operators:: Built-in operators |
| * Built-In Func/Proc:: Built-in functions and procedures |
| * M2 Constants:: Modula-2 constants |
| * M2 Types:: Modula-2 types |
| * M2 Defaults:: Default settings for Modula-2 |
| * Deviations:: Deviations from standard Modula-2 |
| * M2 Checks:: Modula-2 type and range checks |
| * M2 Scope:: The scope operators `::' and `.' |
| * GDB/M2:: GDB and Modula-2 |
| |
| |
| File: gdb.info, Node: M2 Operators, Next: Built-In Func/Proc, Up: Modula-2 |
| |
| 15.4.6.1 Operators |
| .................. |
| |
| Operators must be defined on values of specific types. For instance, |
| `+' is defined on numbers, but not on structures. Operators are often |
| defined on groups of types. For the purposes of Modula-2, the |
| following definitions hold: |
| |
| * _Integral types_ consist of `INTEGER', `CARDINAL', and their |
| subranges. |
| |
| * _Character types_ consist of `CHAR' and its subranges. |
| |
| * _Floating-point types_ consist of `REAL'. |
| |
| * _Pointer types_ consist of anything declared as `POINTER TO TYPE'. |
| |
| * _Scalar types_ consist of all of the above. |
| |
| * _Set types_ consist of `SET' and `BITSET' types. |
| |
| * _Boolean types_ consist of `BOOLEAN'. |
| |
| The following operators are supported, and appear in order of |
| increasing precedence: |
| |
| `,' |
| Function argument or array index separator. |
| |
| `:=' |
| Assignment. The value of VAR `:=' VALUE is VALUE. |
| |
| `<, >' |
| Less than, greater than on integral, floating-point, or enumerated |
| types. |
| |
| `<=, >=' |
| Less than or equal to, greater than or equal to on integral, |
| floating-point and enumerated types, or set inclusion on set |
| types. Same precedence as `<'. |
| |
| `=, <>, #' |
| Equality and two ways of expressing inequality, valid on scalar |
| types. Same precedence as `<'. In GDB scripts, only `<>' is |
| available for inequality, since `#' conflicts with the script |
| comment character. |
| |
| `IN' |
| Set membership. Defined on set types and the types of their |
| members. Same precedence as `<'. |
| |
| `OR' |
| Boolean disjunction. Defined on boolean types. |
| |
| `AND, &' |
| Boolean conjunction. Defined on boolean types. |
| |
| `@' |
| The GDB "artificial array" operator (*note Expressions: |
| Expressions.). |
| |
| `+, -' |
| Addition and subtraction on integral and floating-point types, or |
| union and difference on set types. |
| |
| `*' |
| Multiplication on integral and floating-point types, or set |
| intersection on set types. |
| |
| `/' |
| Division on floating-point types, or symmetric set difference on |
| set types. Same precedence as `*'. |
| |
| `DIV, MOD' |
| Integer division and remainder. Defined on integral types. Same |
| precedence as `*'. |
| |
| `-' |
| Negative. Defined on `INTEGER' and `REAL' data. |
| |
| `^' |
| Pointer dereferencing. Defined on pointer types. |
| |
| `NOT' |
| Boolean negation. Defined on boolean types. Same precedence as |
| `^'. |
| |
| `.' |
| `RECORD' field selector. Defined on `RECORD' data. Same |
| precedence as `^'. |
| |
| `[]' |
| Array indexing. Defined on `ARRAY' data. Same precedence as `^'. |
| |
| `()' |
| Procedure argument list. Defined on `PROCEDURE' objects. Same |
| precedence as `^'. |
| |
| `::, .' |
| GDB and Modula-2 scope operators. |
| |
| _Warning:_ Set expressions and their operations are not yet |
| supported, so GDB treats the use of the operator `IN', or the use |
| of operators `+', `-', `*', `/', `=', , `<>', `#', `<=', and `>=' |
| on sets as an error. |
| |
| |
| File: gdb.info, Node: Built-In Func/Proc, Next: M2 Constants, Prev: M2 Operators, Up: Modula-2 |
| |
| 15.4.6.2 Built-in Functions and Procedures |
| .......................................... |
| |
| Modula-2 also makes available several built-in procedures and functions. |
| In describing these, the following metavariables are used: |
| |
| A |
| represents an `ARRAY' variable. |
| |
| C |
| represents a `CHAR' constant or variable. |
| |
| I |
| represents a variable or constant of integral type. |
| |
| M |
| represents an identifier that belongs to a set. Generally used in |
| the same function with the metavariable S. The type of S should |
| be `SET OF MTYPE' (where MTYPE is the type of M). |
| |
| N |
| represents a variable or constant of integral or floating-point |
| type. |
| |
| R |
| represents a variable or constant of floating-point type. |
| |
| T |
| represents a type. |
| |
| V |
| represents a variable. |
| |
| X |
| represents a variable or constant of one of many types. See the |
| explanation of the function for details. |
| |
| All Modula-2 built-in procedures also return a result, described |
| below. |
| |
| `ABS(N)' |
| Returns the absolute value of N. |
| |
| `CAP(C)' |
| If C is a lower case letter, it returns its upper case equivalent, |
| otherwise it returns its argument. |
| |
| `CHR(I)' |
| Returns the character whose ordinal value is I. |
| |
| `DEC(V)' |
| Decrements the value in the variable V by one. Returns the new |
| value. |
| |
| `DEC(V,I)' |
| Decrements the value in the variable V by I. Returns the new |
| value. |
| |
| `EXCL(M,S)' |
| Removes the element M from the set S. Returns the new set. |
| |
| `FLOAT(I)' |
| Returns the floating point equivalent of the integer I. |
| |
| `HIGH(A)' |
| Returns the index of the last member of A. |
| |
| `INC(V)' |
| Increments the value in the variable V by one. Returns the new |
| value. |
| |
| `INC(V,I)' |
| Increments the value in the variable V by I. Returns the new |
| value. |
| |
| `INCL(M,S)' |
| Adds the element M to the set S if it is not already there. |
| Returns the new set. |
| |
| `MAX(T)' |
| Returns the maximum value of the type T. |
| |
| `MIN(T)' |
| Returns the minimum value of the type T. |
| |
| `ODD(I)' |
| Returns boolean TRUE if I is an odd number. |
| |
| `ORD(X)' |
| Returns the ordinal value of its argument. For example, the |
| ordinal value of a character is its ASCII value (on machines |
| supporting the ASCII character set). X must be of an ordered |
| type, which include integral, character and enumerated types. |
| |
| `SIZE(X)' |
| Returns the size of its argument. X can be a variable or a type. |
| |
| `TRUNC(R)' |
| Returns the integral part of R. |
| |
| `TSIZE(X)' |
| Returns the size of its argument. X can be a variable or a type. |
| |
| `VAL(T,I)' |
| Returns the member of the type T whose ordinal value is I. |
| |
| _Warning:_ Sets and their operations are not yet supported, so |
| GDB treats the use of procedures `INCL' and `EXCL' as an error. |
| |
| |
| File: gdb.info, Node: M2 Constants, Next: M2 Types, Prev: Built-In Func/Proc, Up: Modula-2 |
| |
| 15.4.6.3 Constants |
| .................. |
| |
| GDB allows you to express the constants of Modula-2 in the following |
| ways: |
| |
| * Integer constants are simply a sequence of digits. When used in an |
| expression, a constant is interpreted to be type-compatible with |
| the rest of the expression. Hexadecimal integers are specified by |
| a trailing `H', and octal integers by a trailing `B'. |
| |
| * Floating point constants appear as a sequence of digits, followed |
| by a decimal point and another sequence of digits. An optional |
| exponent can then be specified, in the form `E[+|-]NNN', where |
| `[+|-]NNN' is the desired exponent. All of the digits of the |
| floating point constant must be valid decimal (base 10) digits. |
| |
| * Character constants consist of a single character enclosed by a |
| pair of like quotes, either single (`'') or double (`"'). They may |
| also be expressed by their ordinal value (their ASCII value, |
| usually) followed by a `C'. |
| |
| * String constants consist of a sequence of characters enclosed by a |
| pair of like quotes, either single (`'') or double (`"'). Escape |
| sequences in the style of C are also allowed. *Note C and C++ |
| Constants: C Constants, for a brief explanation of escape |
| sequences. |
| |
| * Enumerated constants consist of an enumerated identifier. |
| |
| * Boolean constants consist of the identifiers `TRUE' and `FALSE'. |
| |
| * Pointer constants consist of integral values only. |
| |
| * Set constants are not yet supported. |
| |
| |
| File: gdb.info, Node: M2 Types, Next: M2 Defaults, Prev: M2 Constants, Up: Modula-2 |
| |
| 15.4.6.4 Modula-2 Types |
| ....................... |
| |
| Currently GDB can print the following data types in Modula-2 syntax: |
| array types, record types, set types, pointer types, procedure types, |
| enumerated types, subrange types and base types. You can also print |
| the contents of variables declared using these type. This section |
| gives a number of simple source code examples together with sample GDB |
| sessions. |
| |
| The first example contains the following section of code: |
| |
| VAR |
| s: SET OF CHAR ; |
| r: [20..40] ; |
| |
| and you can request GDB to interrogate the type and value of `r' and |
| `s'. |
| |
| (gdb) print s |
| {'A'..'C', 'Z'} |
| (gdb) ptype s |
| SET OF CHAR |
| (gdb) print r |
| 21 |
| (gdb) ptype r |
| [20..40] |
| |
| Likewise if your source code declares `s' as: |
| |
| VAR |
| s: SET ['A'..'Z'] ; |
| |
| then you may query the type of `s' by: |
| |
| (gdb) ptype s |
| type = SET ['A'..'Z'] |
| |
| Note that at present you cannot interactively manipulate set |
| expressions using the debugger. |
| |
| The following example shows how you might declare an array in |
| Modula-2 and how you can interact with GDB to print its type and |
| contents: |
| |
| VAR |
| s: ARRAY [-10..10] OF CHAR ; |
| |
| (gdb) ptype s |
| ARRAY [-10..10] OF CHAR |
| |
| Note that the array handling is not yet complete and although the |
| type is printed correctly, expression handling still assumes that all |
| arrays have a lower bound of zero and not `-10' as in the example above. |
| |
| Here are some more type related Modula-2 examples: |
| |
| TYPE |
| colour = (blue, red, yellow, green) ; |
| t = [blue..yellow] ; |
| VAR |
| s: t ; |
| BEGIN |
| s := blue ; |
| |
| The GDB interaction shows how you can query the data type and value of |
| a variable. |
| |
| (gdb) print s |
| $1 = blue |
| (gdb) ptype t |
| type = [blue..yellow] |
| |
| In this example a Modula-2 array is declared and its contents |
| displayed. Observe that the contents are written in the same way as |
| their `C' counterparts. |
| |
| VAR |
| s: ARRAY [1..5] OF CARDINAL ; |
| BEGIN |
| s[1] := 1 ; |
| |
| (gdb) print s |
| $1 = {1, 0, 0, 0, 0} |
| (gdb) ptype s |
| type = ARRAY [1..5] OF CARDINAL |
| |
| The Modula-2 language interface to GDB also understands pointer |
| types as shown in this example: |
| |
| VAR |
| s: POINTER TO ARRAY [1..5] OF CARDINAL ; |
| BEGIN |
| NEW(s) ; |
| s^[1] := 1 ; |
| |
| and you can request that GDB describes the type of `s'. |
| |
| (gdb) ptype s |
| type = POINTER TO ARRAY [1..5] OF CARDINAL |
| |
| GDB handles compound types as we can see in this example. Here we |
| combine array types, record types, pointer types and subrange types: |
| |
| TYPE |
| foo = RECORD |
| f1: CARDINAL ; |
| f2: CHAR ; |
| f3: myarray ; |
| END ; |
| |
| myarray = ARRAY myrange OF CARDINAL ; |
| myrange = [-2..2] ; |
| VAR |
| s: POINTER TO ARRAY myrange OF foo ; |
| |
| and you can ask GDB to describe the type of `s' as shown below. |
| |
| (gdb) ptype s |
| type = POINTER TO ARRAY [-2..2] OF foo = RECORD |
| f1 : CARDINAL; |
| f2 : CHAR; |
| f3 : ARRAY [-2..2] OF CARDINAL; |
| END |
| |
| |
| File: gdb.info, Node: M2 Defaults, Next: Deviations, Prev: M2 Types, Up: Modula-2 |
| |
| 15.4.6.5 Modula-2 Defaults |
| .......................... |
| |
| If type and range checking are set automatically by GDB, they both |
| default to `on' whenever the working language changes to Modula-2. |
| This happens regardless of whether you or GDB selected the working |
| language. |
| |
| If you allow GDB to set the language automatically, then entering |
| code compiled from a file whose name ends with `.mod' sets the working |
| language to Modula-2. *Note Having GDB Infer the Source Language: |
| Automatically, for further details. |
| |
| |
| File: gdb.info, Node: Deviations, Next: M2 Checks, Prev: M2 Defaults, Up: Modula-2 |
| |
| 15.4.6.6 Deviations from Standard Modula-2 |
| .......................................... |
| |
| A few changes have been made to make Modula-2 programs easier to debug. |
| This is done primarily via loosening its type strictness: |
| |
| * Unlike in standard Modula-2, pointer constants can be formed by |
| integers. This allows you to modify pointer variables during |
| debugging. (In standard Modula-2, the actual address contained in |
| a pointer variable is hidden from you; it can only be modified |
| through direct assignment to another pointer variable or |
| expression that returned a pointer.) |
| |
| * C escape sequences can be used in strings and characters to |
| represent non-printable characters. GDB prints out strings with |
| these escape sequences embedded. Single non-printable characters |
| are printed using the `CHR(NNN)' format. |
| |
| * The assignment operator (`:=') returns the value of its right-hand |
| argument. |
| |
| * All built-in procedures both modify _and_ return their argument. |
| |
| |
| File: gdb.info, Node: M2 Checks, Next: M2 Scope, Prev: Deviations, Up: Modula-2 |
| |
| 15.4.6.7 Modula-2 Type and Range Checks |
| ....................................... |
| |
| _Warning:_ in this release, GDB does not yet perform type or range |
| checking. |
| |
| GDB considers two Modula-2 variables type equivalent if: |
| |
| * They are of types that have been declared equivalent via a `TYPE |
| T1 = T2' statement |
| |
| * They have been declared on the same line. (Note: This is true of |
| the GNU Modula-2 compiler, but it may not be true of other |
| compilers.) |
| |
| As long as type checking is enabled, any attempt to combine variables |
| whose types are not equivalent is an error. |
| |
| Range checking is done on all mathematical operations, assignment, |
| array index bounds, and all built-in functions and procedures. |
| |
| |
| File: gdb.info, Node: M2 Scope, Next: GDB/M2, Prev: M2 Checks, Up: Modula-2 |
| |
| 15.4.6.8 The Scope Operators `::' and `.' |
| ......................................... |
| |
| There are a few subtle differences between the Modula-2 scope operator |
| (`.') and the GDB scope operator (`::'). The two have similar syntax: |
| |
| |
| MODULE . ID |
| SCOPE :: ID |
| |
| where SCOPE is the name of a module or a procedure, MODULE the name of |
| a module, and ID is any declared identifier within your program, except |
| another module. |
| |
| Using the `::' operator makes GDB search the scope specified by |
| SCOPE for the identifier ID. If it is not found in the specified |
| scope, then GDB searches all scopes enclosing the one specified by |
| SCOPE. |
| |
| Using the `.' operator makes GDB search the current scope for the |
| identifier specified by ID that was imported from the definition module |
| specified by MODULE. With this operator, it is an error if the |
| identifier ID was not imported from definition module MODULE, or if ID |
| is not an identifier in MODULE. |
| |
| |
| File: gdb.info, Node: GDB/M2, Prev: M2 Scope, Up: Modula-2 |
| |
| 15.4.6.9 GDB and Modula-2 |
| ......................... |
| |
| Some GDB commands have little use when debugging Modula-2 programs. |
| Five subcommands of `set print' and `show print' apply specifically to |
| C and C++: `vtbl', `demangle', `asm-demangle', `object', and `union'. |
| The first four apply to C++, and the last to the C `union' type, which |
| has no direct analogue in Modula-2. |
| |
| The `@' operator (*note Expressions: Expressions.), while available |
| with any language, is not useful with Modula-2. Its intent is to aid |
| the debugging of "dynamic arrays", which cannot be created in Modula-2 |
| as they can in C or C++. However, because an address can be specified |
| by an integral constant, the construct `{TYPE}ADREXP' is still useful. |
| |
| In GDB scripts, the Modula-2 inequality operator `#' is interpreted |
| as the beginning of a comment. Use `<>' instead. |
| |
| |
| File: gdb.info, Node: Ada, Prev: Modula-2, Up: Supported Languages |
| |
| 15.4.7 Ada |
| ---------- |
| |
| The extensions made to GDB for Ada only support output from the GNU Ada |
| (GNAT) compiler. Other Ada compilers are not currently supported, and |
| attempting to debug executables produced by them is most likely to be |
| difficult. |
| |
| * Menu: |
| |
| * Ada Mode Intro:: General remarks on the Ada syntax |
| and semantics supported by Ada mode |
| in GDB. |
| * Omissions from Ada:: Restrictions on the Ada expression syntax. |
| * Additions to Ada:: Extensions of the Ada expression syntax. |
| * Stopping Before Main Program:: Debugging the program during elaboration. |
| * Ada Tasks:: Listing and setting breakpoints in tasks. |
| * Ada Tasks and Core Files:: Tasking Support when Debugging Core Files |
| * Ada Glitches:: Known peculiarities of Ada mode. |
| |
| |
| File: gdb.info, Node: Ada Mode Intro, Next: Omissions from Ada, Up: Ada |
| |
| 15.4.7.1 Introduction |
| ..................... |
| |
| The Ada mode of GDB supports a fairly large subset of Ada expression |
| syntax, with some extensions. The philosophy behind the design of this |
| subset is |
| |
| * That GDB should provide basic literals and access to operations for |
| arithmetic, dereferencing, field selection, indexing, and |
| subprogram calls, leaving more sophisticated computations to |
| subprograms written into the program (which therefore may be |
| called from GDB). |
| |
| * That type safety and strict adherence to Ada language restrictions |
| are not particularly important to the GDB user. |
| |
| * That brevity is important to the GDB user. |
| |
| Thus, for brevity, the debugger acts as if all names declared in |
| user-written packages are directly visible, even if they are not visible |
| according to Ada rules, thus making it unnecessary to fully qualify most |
| names with their packages, regardless of context. Where this causes |
| ambiguity, GDB asks the user's intent. |
| |
| The debugger will start in Ada mode if it detects an Ada main |
| program. As for other languages, it will enter Ada mode when stopped |
| in a program that was translated from an Ada source file. |
| |
| While in Ada mode, you may use `-' for comments. This is useful |
| mostly for documenting command files. The standard GDB comment (`#') |
| still works at the beginning of a line in Ada mode, but not in the |
| middle (to allow based literals). |
| |
| The debugger supports limited overloading. Given a subprogram call |
| in which the function symbol has multiple definitions, it will use the |
| number of actual parameters and some information about their types to |
| attempt to narrow the set of definitions. It also makes very limited |
| use of context, preferring procedures to functions in the context of |
| the `call' command, and functions to procedures elsewhere. |
| |
| |
| File: gdb.info, Node: Omissions from Ada, Next: Additions to Ada, Prev: Ada Mode Intro, Up: Ada |
| |
| 15.4.7.2 Omissions from Ada |
| ........................... |
| |
| Here are the notable omissions from the subset: |
| |
| * Only a subset of the attributes are supported: |
| |
| - 'First, 'Last, and 'Length on array objects (not on types |
| and subtypes). |
| |
| - 'Min and 'Max. |
| |
| - 'Pos and 'Val. |
| |
| - 'Tag. |
| |
| - 'Range on array objects (not subtypes), but only as the right |
| operand of the membership (`in') operator. |
| |
| - 'Access, 'Unchecked_Access, and 'Unrestricted_Access (a GNAT |
| extension). |
| |
| - 'Address. |
| |
| * The names in `Characters.Latin_1' are not available and |
| concatenation is not implemented. Thus, escape characters in |
| strings are not currently available. |
| |
| * Equality tests (`=' and `/=') on arrays test for bitwise equality |
| of representations. They will generally work correctly for |
| strings and arrays whose elements have integer or enumeration |
| types. They may not work correctly for arrays whose element types |
| have user-defined equality, for arrays of real values (in |
| particular, IEEE-conformant floating point, because of negative |
| zeroes and NaNs), and for arrays whose elements contain unused |
| bits with indeterminate values. |
| |
| * The other component-by-component array operations (`and', `or', |
| `xor', `not', and relational tests other than equality) are not |
| implemented. |
| |
| * There is limited support for array and record aggregates. They are |
| permitted only on the right sides of assignments, as in these |
| examples: |
| |
| (gdb) set An_Array := (1, 2, 3, 4, 5, 6) |
| (gdb) set An_Array := (1, others => 0) |
| (gdb) set An_Array := (0|4 => 1, 1..3 => 2, 5 => 6) |
| (gdb) set A_2D_Array := ((1, 2, 3), (4, 5, 6), (7, 8, 9)) |
| (gdb) set A_Record := (1, "Peter", True); |
| (gdb) set A_Record := (Name => "Peter", Id => 1, Alive => True) |
| |
| Changing a discriminant's value by assigning an aggregate has an |
| undefined effect if that discriminant is used within the record. |
| However, you can first modify discriminants by directly assigning |
| to them (which normally would not be allowed in Ada), and then |
| performing an aggregate assignment. For example, given a variable |
| `A_Rec' declared to have a type such as: |
| |
| type Rec (Len : Small_Integer := 0) is record |
| Id : Integer; |
| Vals : IntArray (1 .. Len); |
| end record; |
| |
| you can assign a value with a different size of `Vals' with two |
| assignments: |
| |
| (gdb) set A_Rec.Len := 4 |
| (gdb) set A_Rec := (Id => 42, Vals => (1, 2, 3, 4)) |
| |
| As this example also illustrates, GDB is very loose about the usual |
| rules concerning aggregates. You may leave out some of the |
| components of an array or record aggregate (such as the `Len' |
| component in the assignment to `A_Rec' above); they will retain |
| their original values upon assignment. You may freely use dynamic |
| values as indices in component associations. You may even use |
| overlapping or redundant component associations, although which |
| component values are assigned in such cases is not defined. |
| |
| * Calls to dispatching subprograms are not implemented. |
| |
| * The overloading algorithm is much more limited (i.e., less |
| selective) than that of real Ada. It makes only limited use of |
| the context in which a subexpression appears to resolve its |
| meaning, and it is much looser in its rules for allowing type |
| matches. As a result, some function calls will be ambiguous, and |
| the user will be asked to choose the proper resolution. |
| |
| * The `new' operator is not implemented. |
| |
| * Entry calls are not implemented. |
| |
| * Aside from printing, arithmetic operations on the native VAX |
| floating-point formats are not supported. |
| |
| * It is not possible to slice a packed array. |
| |
| * The names `True' and `False', when not part of a qualified name, |
| are interpreted as if implicitly prefixed by `Standard', |
| regardless of context. Should your program redefine these names |
| in a package or procedure (at best a dubious practice), you will |
| have to use fully qualified names to access their new definitions. |
| |
| |
| File: gdb.info, Node: Additions to Ada, Next: Stopping Before Main Program, Prev: Omissions from Ada, Up: Ada |
| |
| 15.4.7.3 Additions to Ada |
| ......................... |
| |
| As it does for other languages, GDB makes certain generic extensions to |
| Ada (*note Expressions::): |
| |
| * If the expression E is a variable residing in memory (typically a |
| local variable or array element) and N is a positive integer, then |
| `E@N' displays the values of E and the N-1 adjacent variables |
| following it in memory as an array. In Ada, this operator is |
| generally not necessary, since its prime use is in displaying |
| parts of an array, and slicing will usually do this in Ada. |
| However, there are occasional uses when debugging programs in |
| which certain debugging information has been optimized away. |
| |
| * `B::VAR' means "the variable named VAR that appears in function or |
| file B." When B is a file name, you must typically surround it in |
| single quotes. |
| |
| * The expression `{TYPE} ADDR' means "the variable of type TYPE that |
| appears at address ADDR." |
| |
| * A name starting with `$' is a convenience variable (*note |
| Convenience Vars::) or a machine register (*note Registers::). |
| |
| In addition, GDB provides a few other shortcuts and outright |
| additions specific to Ada: |
| |
| * The assignment statement is allowed as an expression, returning |
| its right-hand operand as its value. Thus, you may enter |
| |
| (gdb) set x := y + 3 |
| (gdb) print A(tmp := y + 1) |
| |
| * The semicolon is allowed as an "operator," returning as its value |
| the value of its right-hand operand. This allows, for example, |
| complex conditional breaks: |
| |
| (gdb) break f |
| (gdb) condition 1 (report(i); k += 1; A(k) > 100) |
| |
| * Rather than use catenation and symbolic character names to |
| introduce special characters into strings, one may instead use a |
| special bracket notation, which is also used to print strings. A |
| sequence of characters of the form `["XX"]' within a string or |
| character literal denotes the (single) character whose numeric |
| encoding is XX in hexadecimal. The sequence of characters `["""]' |
| also denotes a single quotation mark in strings. For example,<
|