| <html lang="en"> |
| <head> |
| <title>DJGPP Native - Debugging with GDB</title> |
| <meta http-equiv="Content-Type" content="text/html"> |
| <meta name="description" content="Debugging with GDB"> |
| <meta name="generator" content="makeinfo 4.13"> |
| <link title="Top" rel="start" href="index.html#Top"> |
| <link rel="up" href="Native.html#Native" title="Native"> |
| <link rel="prev" href="Process-Information.html#Process-Information" title="Process Information"> |
| <link rel="next" href="Cygwin-Native.html#Cygwin-Native" title="Cygwin Native"> |
| <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> |
| <!-- |
| Copyright (C) 1988-2019 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.'' |
| --> |
| <meta http-equiv="Content-Style-Type" content="text/css"> |
| <style type="text/css"><!-- |
| pre.display { font-family:inherit } |
| pre.format { font-family:inherit } |
| pre.smalldisplay { font-family:inherit; font-size:smaller } |
| pre.smallformat { font-family:inherit; font-size:smaller } |
| pre.smallexample { font-size:smaller } |
| pre.smalllisp { font-size:smaller } |
| span.sc { font-variant:small-caps } |
| span.roman { font-family:serif; font-weight:normal; } |
| span.sansserif { font-family:sans-serif; font-weight:normal; } |
| --></style> |
| </head> |
| <body> |
| <div class="node"> |
| <a name="DJGPP-Native"></a> |
| <p> |
| Next: <a rel="next" accesskey="n" href="Cygwin-Native.html#Cygwin-Native">Cygwin Native</a>, |
| Previous: <a rel="previous" accesskey="p" href="Process-Information.html#Process-Information">Process Information</a>, |
| Up: <a rel="up" accesskey="u" href="Native.html#Native">Native</a> |
| <hr> |
| </div> |
| |
| <h4 class="subsection">21.1.3 Features for Debugging <span class="sc">djgpp</span> Programs</h4> |
| |
| <p><a name="index-g_t_0040sc_007bdjgpp_007d-debugging-1467"></a><a name="index-native-_0040sc_007bdjgpp_007d-debugging-1468"></a><a name="index-MS_002dDOS_002dspecific-commands-1469"></a> |
| <a name="index-DPMI-1470"></a><span class="sc">djgpp</span> is a port of the <span class="sc">gnu</span> development tools to MS-DOS and |
| MS-Windows. <span class="sc">djgpp</span> programs are 32-bit protected-mode programs |
| that use the <dfn>DPMI</dfn> (DOS Protected-Mode Interface) API to run on |
| top of real-mode DOS systems and their emulations. |
| |
| <p><span class="sc">gdb</span> supports native debugging of <span class="sc">djgpp</span> programs, and |
| defines a few commands specific to the <span class="sc">djgpp</span> port. This |
| subsection describes those commands. |
| |
| |
| <a name="index-info-dos-1471"></a> |
| <dl><dt><code>info dos</code><dd>This is a prefix of <span class="sc">djgpp</span>-specific commands which print |
| information about the target system and important OS structures. |
| |
| <p><a name="index-sysinfo-1472"></a><a name="index-MS_002dDOS-system-info-1473"></a><a name="index-free-memory-information-_0028MS_002dDOS_0029-1474"></a><br><dt><code>info dos sysinfo</code><dd>This command displays assorted information about the underlying |
| platform: the CPU type and features, the OS version and flavor, the |
| DPMI version, and the available conventional and DPMI memory. |
| |
| <p><a name="index-GDT-1475"></a><a name="index-LDT-1476"></a><a name="index-IDT-1477"></a><a name="index-segment-descriptor-tables-1478"></a><a name="index-descriptor-tables-display-1479"></a><br><dt><code>info dos gdt</code><dt><code>info dos ldt</code><dt><code>info dos idt</code><dd>These 3 commands display entries from, respectively, Global, Local, |
| and Interrupt Descriptor Tables (GDT, LDT, and IDT). The descriptor |
| tables are data structures which store a descriptor for each segment |
| that is currently in use. The segment's selector is an index into a |
| descriptor table; the table entry for that index holds the |
| descriptor's base address and limit, and its attributes and access |
| rights. |
| |
| <p>A typical <span class="sc">djgpp</span> program uses 3 segments: a code segment, a data |
| segment (used for both data and the stack), and a DOS segment (which |
| allows access to DOS/BIOS data structures and absolute addresses in |
| conventional memory). However, the DPMI host will usually define |
| additional segments in order to support the DPMI environment. |
| |
| <p><a name="index-garbled-pointers-1480"></a>These commands allow to display entries from the descriptor tables. |
| Without an argument, all entries from the specified table are |
| displayed. An argument, which should be an integer expression, means |
| display a single entry whose index is given by the argument. For |
| example, here's a convenient way to display information about the |
| debugged program's data segment: |
| |
| <pre class="smallexample"> <br><code>(gdb) info dos ldt $ds</code><br> |
| <br><code>0x13f: base=0x11970000 limit=0x0009ffff 32-Bit Data (Read/Write, Exp-up)</code><br> |
| </pre> |
| <p class="noindent">This comes in handy when you want to see whether a pointer is outside |
| the data segment's limit (i.e. <dfn>garbled</dfn>). |
| |
| <p><a name="index-page-tables-display-_0028MS_002dDOS_0029-1481"></a><br><dt><code>info dos pde</code><dt><code>info dos pte</code><dd>These two commands display entries from, respectively, the Page |
| Directory and the Page Tables. Page Directories and Page Tables are |
| data structures which control how virtual memory addresses are mapped |
| into physical addresses. A Page Table includes an entry for every |
| page of memory that is mapped into the program's address space; there |
| may be several Page Tables, each one holding up to 4096 entries. A |
| Page Directory has up to 4096 entries, one each for every Page Table |
| that is currently in use. |
| |
| <p>Without an argument, <kbd>info dos pde</kbd> displays the entire Page |
| Directory, and <kbd>info dos pte</kbd> displays all the entries in all of |
| the Page Tables. An argument, an integer expression, given to the |
| <kbd>info dos pde</kbd> command means display only that entry from the Page |
| Directory table. An argument given to the <kbd>info dos pte</kbd> command |
| means display entries from a single Page Table, the one pointed to by |
| the specified entry in the Page Directory. |
| |
| <p><a name="index-direct-memory-access-_0028DMA_0029-on-MS_002dDOS-1482"></a>These commands are useful when your program uses <dfn>DMA</dfn> (Direct |
| Memory Access), which needs physical addresses to program the DMA |
| controller. |
| |
| <p>These commands are supported only with some DPMI servers. |
| |
| <p><a name="index-physical-address-from-linear-address-1483"></a><br><dt><code>info dos address-pte </code><var>addr</var><dd>This command displays the Page Table entry for a specified linear |
| address. The argument <var>addr</var> is a linear address which should |
| already have the appropriate segment's base address added to it, |
| because this command accepts addresses which may belong to <em>any</em> |
| segment. For example, here's how to display the Page Table entry for |
| the page where a variable <code>i</code> is stored: |
| |
| <pre class="smallexample"> <br><code>(gdb) info dos address-pte __djgpp_base_address + (char *)&i</code><br> |
| <br><code>Page Table entry for address 0x11a00d30:</code><br> |
| <br><code>Base=0x02698000 Dirty Acc. Not-Cached Write-Back Usr Read-Write +0xd30</code><br> |
| </pre> |
| <p class="noindent">This says that <code>i</code> is stored at offset <code>0xd30</code> from the page |
| whose physical base address is <code>0x02698000</code>, and shows all the |
| attributes of that page. |
| |
| <p>Note that you must cast the addresses of variables to a <code>char *</code>, |
| since otherwise the value of <code>__djgpp_base_address</code>, the base |
| address of all variables and functions in a <span class="sc">djgpp</span> program, will |
| be added using the rules of C pointer arithmetics: if <code>i</code> is |
| declared an <code>int</code>, <span class="sc">gdb</span> will add 4 times the value of |
| <code>__djgpp_base_address</code> to the address of <code>i</code>. |
| |
| <p>Here's another example, it displays the Page Table entry for the |
| transfer buffer: |
| |
| <pre class="smallexample"> <br><code>(gdb) info dos address-pte *((unsigned *)&_go32_info_block + 3)</code><br> |
| <br><code>Page Table entry for address 0x29110:</code><br> |
| <br><code>Base=0x00029000 Dirty Acc. Not-Cached Write-Back Usr Read-Write +0x110</code><br> |
| </pre> |
| <p class="noindent">(The <code>+ 3</code> offset is because the transfer buffer's address is the |
| 3rd member of the <code>_go32_info_block</code> structure.) The output |
| clearly shows that this DPMI server maps the addresses in conventional |
| memory 1:1, i.e. the physical (<code>0x00029000</code> + <code>0x110</code>) and |
| linear (<code>0x29110</code>) addresses are identical. |
| |
| <p>This command is supported only with some DPMI servers. |
| </dl> |
| |
| <p><a name="index-DOS-serial-data-link_002c-remote-debugging-1484"></a>In addition to native debugging, the DJGPP port supports remote |
| debugging via a serial data link. The following commands are specific |
| to remote serial debugging in the DJGPP port of <span class="sc">gdb</span>. |
| |
| |
| <a name="index-set-com1base-1485"></a> |
| <a name="index-set-com1irq-1486"></a> |
| <a name="index-set-com2base-1487"></a> |
| <a name="index-set-com2irq-1488"></a> |
| <a name="index-set-com3base-1489"></a> |
| <a name="index-set-com3irq-1490"></a> |
| <a name="index-set-com4base-1491"></a> |
| <a name="index-set-com4irq-1492"></a> |
| <dl><dt><code>set com1base </code><var>addr</var><dd>This command sets the base I/O port address of the <samp><span class="file">COM1</span></samp> serial |
| port. |
| |
| <br><dt><code>set com1irq </code><var>irq</var><dd>This command sets the <dfn>Interrupt Request</dfn> (<code>IRQ</code>) line to use |
| for the <samp><span class="file">COM1</span></samp> serial port. |
| |
| <p>There are similar commands ‘<samp><span class="samp">set com2base</span></samp>’, ‘<samp><span class="samp">set com3irq</span></samp>’, |
| etc. for setting the port address and the <code>IRQ</code> lines for the |
| other 3 COM ports. |
| |
| <p><a name="index-show-com1base-1493"></a><a name="index-show-com1irq-1494"></a><a name="index-show-com2base-1495"></a><a name="index-show-com2irq-1496"></a><a name="index-show-com3base-1497"></a><a name="index-show-com3irq-1498"></a><a name="index-show-com4base-1499"></a><a name="index-show-com4irq-1500"></a>The related commands ‘<samp><span class="samp">show com1base</span></samp>’, ‘<samp><span class="samp">show com1irq</span></samp>’ etc. |
| display the current settings of the base address and the <code>IRQ</code> |
| lines used by the COM ports. |
| |
| <br><dt><code>info serial</code><dd><a name="index-info-serial-1501"></a><a name="index-DOS-serial-port-status-1502"></a>This command prints the status of the 4 DOS serial ports. For each |
| port, it prints whether it's active or not, its I/O base address and |
| IRQ number, whether it uses a 16550-style FIFO, its baudrate, and the |
| counts of various errors encountered so far. |
| </dl> |
| |
| </body></html> |
| |