blob: fb2c539eadb1637282eeeb341e3d491ec14323f7 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2015 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." -->
<!-- Created by GNU Texinfo 5.2, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Debugging with GDB: Machine Code</title>
<meta name="description" content="Debugging with GDB: Machine Code">
<meta name="keywords" content="Debugging with GDB: Machine Code">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Source.html#Source" rel="up" title="Source">
<link href="Data.html#Data" rel="next" title="Data">
<link href="Source-Path.html#Source-Path" rel="prev" title="Source Path">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
</head>
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Machine-Code"></a>
<div class="header">
<p>
Previous: <a href="Source-Path.html#Source-Path" accesskey="p" rel="prev">Source Path</a>, Up: <a href="Source.html#Source" accesskey="u" rel="up">Source</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Source-and-Machine-Code"></a>
<h3 class="section">9.6 Source and Machine Code</h3>
<a name="index-source-line-and-its-code-address"></a>
<p>You can use the command <code>info line</code> to map source lines to program
addresses (and vice versa), and the command <code>disassemble</code> to display
a range of addresses as machine instructions. You can use the command
<code>set disassemble-next-line</code> to set whether to disassemble next
source line when execution stops. When run under <small>GNU</small> Emacs
mode, the <code>info line</code> command causes the arrow to point to the
line specified. Also, <code>info line</code> prints addresses in symbolic form as
well as hex.
</p>
<dl compact="compact">
<dd><a name="index-info-line"></a>
</dd>
<dt><code>info line <var>linespec</var></code></dt>
<dd><p>Print the starting and ending addresses of the compiled code for
source line <var>linespec</var>. You can specify source lines in any of
the ways documented in <a href="Specify-Location.html#Specify-Location">Specify Location</a>.
</p></dd>
</dl>
<p>For example, we can use <code>info line</code> to discover the location of
the object code for the first line of function
<code>m4_changequote</code>:
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) info line m4_changequote
Line 895 of &quot;builtin.c&quot; starts at pc 0x634c and ends at 0x6350.
</pre></div>
<a name="index-code-address-and-its-source-line"></a>
<p>We can also inquire (using <code>*<var>addr</var></code> as the form for
<var>linespec</var>) what source line covers a particular address:
</p><div class="smallexample">
<pre class="smallexample">(gdb) info line *0x63ff
Line 926 of &quot;builtin.c&quot; starts at pc 0x63e4 and ends at 0x6404.
</pre></div>
<a name="index-_0024_005f-and-info-line"></a>
<a name="index-x-command_002c-default-address"></a>
<a name="index-x_0028examine_0029_002c-and-info-line"></a>
<p>After <code>info line</code>, the default address for the <code>x</code> command
is changed to the starting address of the line, so that &lsquo;<samp>x/i</samp>&rsquo; is
sufficient to begin examining the machine code (see <a href="Memory.html#Memory">Examining Memory</a>). Also, this address is saved as the value of the
convenience variable <code>$_</code> (see <a href="Convenience-Vars.html#Convenience-Vars">Convenience
Variables</a>).
</p>
<dl compact="compact">
<dd><a name="index-disassemble"></a>
<a name="index-assembly-instructions"></a>
<a name="index-instructions_002c-assembly"></a>
<a name="index-machine-instructions"></a>
<a name="index-listing-machine-instructions"></a>
</dd>
<dt><code>disassemble</code></dt>
<dt><code>disassemble /m</code></dt>
<dt><code>disassemble /r</code></dt>
<dd><p>This specialized command dumps a range of memory as machine
instructions. It can also print mixed source+disassembly by specifying
the <code>/m</code> modifier and print the raw instructions in hex as well as
in symbolic form by specifying the <code>/r</code>.
The default memory range is the function surrounding the
program counter of the selected frame. A single argument to this
command is a program counter value; <small>GDB</small> dumps the function
surrounding this value. When two arguments are given, they should
be separated by a comma, possibly surrounded by whitespace. The
arguments specify a range of addresses to dump, in one of two forms:
</p>
<dl compact="compact">
<dt><code><var>start</var>,<var>end</var></code></dt>
<dd><p>the addresses from <var>start</var> (inclusive) to <var>end</var> (exclusive)
</p></dd>
<dt><code><var>start</var>,+<var>length</var></code></dt>
<dd><p>the addresses from <var>start</var> (inclusive) to
<code><var>start</var>+<var>length</var></code> (exclusive).
</p></dd>
</dl>
<p>When 2 arguments are specified, the name of the function is also
printed (since there could be several functions in the given range).
</p>
<p>The argument(s) can be any expression yielding a numeric value, such as
&lsquo;<samp>0x32c4</samp>&rsquo;, &lsquo;<samp>&amp;main+10</samp>&rsquo; or &lsquo;<samp>$pc - 8</samp>&rsquo;.
</p>
<p>If the range of memory being disassembled contains current program counter,
the instruction at that location is shown with a <code>=&gt;</code> marker.
</p></dd>
</dl>
<p>The following example shows the disassembly of a range of addresses of
HP PA-RISC 2.0 code:
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) disas 0x32c4, 0x32e4
Dump of assembler code from 0x32c4 to 0x32e4:
0x32c4 &lt;main+204&gt;: addil 0,dp
0x32c8 &lt;main+208&gt;: ldw 0x22c(sr0,r1),r26
0x32cc &lt;main+212&gt;: ldil 0x3000,r31
0x32d0 &lt;main+216&gt;: ble 0x3f8(sr4,r31)
0x32d4 &lt;main+220&gt;: ldo 0(r31),rp
0x32d8 &lt;main+224&gt;: addil -0x800,dp
0x32dc &lt;main+228&gt;: ldo 0x588(r1),r26
0x32e0 &lt;main+232&gt;: ldil 0x3000,r31
End of assembler dump.
</pre></div>
<p>Here is an example showing mixed source+assembly for Intel x86, when the
program is stopped just after function prologue:
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) disas /m main
Dump of assembler code for function main:
5 {
0x08048330 &lt;+0&gt;: push %ebp
0x08048331 &lt;+1&gt;: mov %esp,%ebp
0x08048333 &lt;+3&gt;: sub $0x8,%esp
0x08048336 &lt;+6&gt;: and $0xfffffff0,%esp
0x08048339 &lt;+9&gt;: sub $0x10,%esp
6 printf (&quot;Hello.\n&quot;);
=&gt; 0x0804833c &lt;+12&gt;: movl $0x8048440,(%esp)
0x08048343 &lt;+19&gt;: call 0x8048284 &lt;puts@plt&gt;
7 return 0;
8 }
0x08048348 &lt;+24&gt;: mov $0x0,%eax
0x0804834d &lt;+29&gt;: leave
0x0804834e &lt;+30&gt;: ret
End of assembler dump.
</pre></div>
<p>Here is another example showing raw instructions in hex for AMD x86-64,
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) disas /r 0x400281,+10
Dump of assembler code from 0x400281 to 0x40028b:
0x0000000000400281: 38 36 cmp %dh,(%rsi)
0x0000000000400283: 2d 36 34 2e 73 sub $0x732e3436,%eax
0x0000000000400288: 6f outsl %ds:(%rsi),(%dx)
0x0000000000400289: 2e 32 00 xor %cs:(%rax),%al
End of assembler dump.
</pre></div>
<p>Addresses cannot be specified as a linespec (see <a href="Specify-Location.html#Specify-Location">Specify Location</a>).
So, for example, if you want to disassemble function <code>bar</code>
in file <samp>foo.c</samp>, you must type &lsquo;<samp>disassemble 'foo.c'::bar</samp>&rsquo;
and not &lsquo;<samp>disassemble foo.c:bar</samp>&rsquo;.
</p>
<p>Some architectures have more than one commonly-used set of instruction
mnemonics or other syntax.
</p>
<p>For programs that were dynamically linked and use shared libraries,
instructions that call functions or branch to locations in the shared
libraries might show a seemingly bogus location&mdash;it&rsquo;s actually a
location of the relocation table. On some architectures, <small>GDB</small>
might be able to resolve these to actual function names.
</p>
<dl compact="compact">
<dd><a name="index-set-disassembly_002dflavor"></a>
<a name="index-Intel-disassembly-flavor"></a>
<a name="index-AT_0026T-disassembly-flavor"></a>
</dd>
<dt><code>set disassembly-flavor <var>instruction-set</var></code></dt>
<dd><p>Select the instruction set to use when disassembling the
program via the <code>disassemble</code> or <code>x/i</code> commands.
</p>
<p>Currently this command is only defined for the Intel x86 family. You
can set <var>instruction-set</var> to either <code>intel</code> or <code>att</code>.
The default is <code>att</code>, the AT&amp;T flavor used by default by Unix
assemblers for x86-based targets.
</p>
<a name="index-show-disassembly_002dflavor"></a>
</dd>
<dt><code>show disassembly-flavor</code></dt>
<dd><p>Show the current setting of the disassembly flavor.
</p></dd>
</dl>
<dl compact="compact">
<dd><a name="index-set-disassemble_002dnext_002dline"></a>
<a name="index-show-disassemble_002dnext_002dline"></a>
</dd>
<dt><code>set disassemble-next-line</code></dt>
<dt><code>show disassemble-next-line</code></dt>
<dd><p>Control whether or not <small>GDB</small> will disassemble the next source
line or instruction when execution stops. If ON, <small>GDB</small> will
display disassembly of the next source line when execution of the
program being debugged stops. This is <em>in addition</em> to
displaying the source line itself, which <small>GDB</small> always does if
possible. If the next source line cannot be displayed for some reason
(e.g., if <small>GDB</small> cannot find the source file, or there&rsquo;s no line
info in the debug info), <small>GDB</small> will display disassembly of the
next <em>instruction</em> instead of showing the next source line. If
AUTO, <small>GDB</small> will display disassembly of next instruction only
if the source line cannot be displayed. This setting causes
<small>GDB</small> to display some feedback when you step through a function
with no line info or whose source file is unavailable. The default is
OFF, which means never display the disassembly of the next line or
instruction.
</p></dd>
</dl>
<hr>
<div class="header">
<p>
Previous: <a href="Source-Path.html#Source-Path" accesskey="p" rel="prev">Source Path</a>, Up: <a href="Source.html#Source" accesskey="u" rel="up">Source</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
</body>
</html>