193 lines
11 KiB
HTML
193 lines
11 KiB
HTML
|
<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>
|
||
|
|