blob: 051cc35ca00edb75e9cbbed91911668c159bb87c [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: Source Path</title>
<meta name="description" content="Debugging with GDB: Source Path">
<meta name="keywords" content="Debugging with GDB: Source Path">
<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="Machine-Code.html#Machine-Code" rel="next" title="Machine Code">
<link href="Search.html#Search" rel="prev" title="Search">
<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="Source-Path"></a>
<div class="header">
<p>
Next: <a href="Machine-Code.html#Machine-Code" accesskey="n" rel="next">Machine Code</a>, Previous: <a href="Search.html#Search" accesskey="p" rel="prev">Search</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="Specifying-Source-Directories"></a>
<h3 class="section">9.5 Specifying Source Directories</h3>
<a name="index-source-path"></a>
<a name="index-directories-for-source-files"></a>
<p>Executable programs sometimes do not record the directories of the source
files from which they were compiled, just the names. Even when they do,
the directories could be moved between the compilation and your debugging
session. <small>GDB</small> has a list of directories to search for source files;
this is called the <em>source path</em>. Each time <small>GDB</small> wants a source file,
it tries all the directories in the list, in the order they are present
in the list, until it finds a file with the desired name.
</p>
<p>For example, suppose an executable references the file
<samp>/usr/src/foo-1.0/lib/foo.c</samp>, and our source path is
<samp>/mnt/cross</samp>. The file is first looked up literally; if this
fails, <samp>/mnt/cross/usr/src/foo-1.0/lib/foo.c</samp> is tried; if this
fails, <samp>/mnt/cross/foo.c</samp> is opened; if this fails, an error
message is printed. <small>GDB</small> does not look up the parts of the
source file name, such as <samp>/mnt/cross/src/foo-1.0/lib/foo.c</samp>.
Likewise, the subdirectories of the source path are not searched: if
the source path is <samp>/mnt/cross</samp>, and the binary refers to
<samp>foo.c</samp>, <small>GDB</small> would not find it under
<samp>/mnt/cross/usr/src/foo-1.0/lib</samp>.
</p>
<p>Plain file names, relative file names with leading directories, file
names containing dots, etc. are all treated as described above; for
instance, if the source path is <samp>/mnt/cross</samp>, and the source file
is recorded as <samp>../lib/foo.c</samp>, <small>GDB</small> would first try
<samp>../lib/foo.c</samp>, then <samp>/mnt/cross/../lib/foo.c</samp>, and after
that&mdash;<samp>/mnt/cross/foo.c</samp>.
</p>
<p>Note that the executable search path is <em>not</em> used to locate the
source files.
</p>
<p>Whenever you reset or rearrange the source path, <small>GDB</small> clears out
any information it has cached about where source files are found and where
each line is in the file.
</p>
<a name="index-directory"></a>
<a name="index-dir"></a>
<p>When you start <small>GDB</small>, its source path includes only &lsquo;<samp>cdir</samp>&rsquo;
and &lsquo;<samp>cwd</samp>&rsquo;, in that order.
To add other directories, use the <code>directory</code> command.
</p>
<p>The search path is used to find both program source files and <small>GDB</small>
script files (read using the &lsquo;<samp>-command</samp>&rsquo; option and &lsquo;<samp>source</samp>&rsquo; command).
</p>
<p>In addition to the source path, <small>GDB</small> provides a set of commands
that manage a list of source path substitution rules. A <em>substitution
rule</em> specifies how to rewrite source directories stored in the program&rsquo;s
debug information in case the sources were moved to a different
directory between compilation and debugging. A rule is made of
two strings, the first specifying what needs to be rewritten in
the path, and the second specifying how it should be rewritten.
In <a href="#set-substitute_002dpath">set substitute-path</a>, we name these two parts <var>from</var> and
<var>to</var> respectively. <small>GDB</small> does a simple string replacement
of <var>from</var> with <var>to</var> at the start of the directory part of the
source file name, and uses that result instead of the original file
name to look up the sources.
</p>
<p>Using the previous example, suppose the <samp>foo-1.0</samp> tree has been
moved from <samp>/usr/src</samp> to <samp>/mnt/cross</samp>, then you can tell
<small>GDB</small> to replace <samp>/usr/src</samp> in all source path names with
<samp>/mnt/cross</samp>. The first lookup will then be
<samp>/mnt/cross/foo-1.0/lib/foo.c</samp> in place of the original location
of <samp>/usr/src/foo-1.0/lib/foo.c</samp>. To define a source path
substitution rule, use the <code>set substitute-path</code> command
(see <a href="#set-substitute_002dpath">set substitute-path</a>).
</p>
<p>To avoid unexpected substitution results, a rule is applied only if the
<var>from</var> part of the directory name ends at a directory separator.
For instance, a rule substituting <samp>/usr/source</samp> into
<samp>/mnt/cross</samp> will be applied to <samp>/usr/source/foo-1.0</samp> but
not to <samp>/usr/sourceware/foo-2.0</samp>. And because the substitution
is applied only at the beginning of the directory name, this rule will
not be applied to <samp>/root/usr/source/baz.c</samp> either.
</p>
<p>In many cases, you can achieve the same result using the <code>directory</code>
command. However, <code>set substitute-path</code> can be more efficient in
the case where the sources are organized in a complex tree with multiple
subdirectories. With the <code>directory</code> command, you need to add each
subdirectory of your project. If you moved the entire tree while
preserving its internal organization, then <code>set substitute-path</code>
allows you to direct the debugger to all the sources with one single
command.
</p>
<p><code>set substitute-path</code> is also more than just a shortcut command.
The source path is only used if the file at the original location no
longer exists. On the other hand, <code>set substitute-path</code> modifies
the debugger behavior to look at the rewritten location instead. So, if
for any reason a source file that is not relevant to your executable is
located at the original location, a substitution rule is the only
method available to point <small>GDB</small> at the new location.
</p>
<a name="index-_002d_002dwith_002drelocated_002dsources"></a>
<a name="index-default-source-path-substitution"></a>
<p>You can configure a default source path substitution rule by
configuring <small>GDB</small> with the
&lsquo;<samp>--with-relocated-sources=<var>dir</var></samp>&rsquo; option. The <var>dir</var>
should be the name of a directory under <small>GDB</small>&rsquo;s configured
prefix (set with &lsquo;<samp>--prefix</samp>&rsquo; or &lsquo;<samp>--exec-prefix</samp>&rsquo;), and
directory names in debug information under <var>dir</var> will be adjusted
automatically if the installed <small>GDB</small> is moved to a new
location. This is useful if <small>GDB</small>, libraries or executables
with debug information and corresponding source code are being moved
together.
</p>
<dl compact="compact">
<dt><code>directory <var>dirname</var> &hellip;</code></dt>
<dt><code>dir <var>dirname</var> &hellip;</code></dt>
<dd><p>Add directory <var>dirname</var> to the front of the source path. Several
directory names may be given to this command, separated by &lsquo;<samp>:</samp>&rsquo;
(&lsquo;<samp>;</samp>&rsquo; on MS-DOS and MS-Windows, where &lsquo;<samp>:</samp>&rsquo; usually appears as
part of absolute file names) or
whitespace. You may specify a directory that is already in the source
path; this moves it forward, so <small>GDB</small> searches it sooner.
</p>
<a name="index-cdir"></a>
<a name="index-cwd"></a>
<a name="index-_0024cdir_002c-convenience-variable"></a>
<a name="index-_0024cwd_002c-convenience-variable"></a>
<a name="index-compilation-directory"></a>
<a name="index-current-directory"></a>
<a name="index-working-directory"></a>
<a name="index-directory_002c-current"></a>
<a name="index-directory_002c-compilation"></a>
<p>You can use the string &lsquo;<samp>$cdir</samp>&rsquo; to refer to the compilation
directory (if one is recorded), and &lsquo;<samp>$cwd</samp>&rsquo; to refer to the current
working directory. &lsquo;<samp>$cwd</samp>&rsquo; is not the same as &lsquo;<samp>.</samp>&rsquo;&mdash;the former
tracks the current working directory as it changes during your <small>GDB</small>
session, while the latter is immediately expanded to the current
directory at the time you add an entry to the source path.
</p>
</dd>
<dt><code>directory</code></dt>
<dd><p>Reset the source path to its default value (&lsquo;<samp>$cdir:$cwd</samp>&rsquo; on Unix systems). This requires confirmation.
</p>
</dd>
<dt><code>set directories <var>path-list</var></code></dt>
<dd><a name="index-set-directories"></a>
<p>Set the source path to <var>path-list</var>.
&lsquo;<samp>$cdir:$cwd</samp>&rsquo; are added if missing.
</p>
</dd>
<dt><code>show directories</code></dt>
<dd><a name="index-show-directories"></a>
<p>Print the source path: show which directories it contains.
</p>
<a name="set-substitute_002dpath"></a></dd>
<dt><code>set substitute-path <var>from</var> <var>to</var></code></dt>
<dd><a name="index-set-substitute_002dpath"></a>
<p>Define a source path substitution rule, and add it at the end of the
current list of existing substitution rules. If a rule with the same
<var>from</var> was already defined, then the old rule is also deleted.
</p>
<p>For example, if the file <samp>/foo/bar/baz.c</samp> was moved to
<samp>/mnt/cross/baz.c</samp>, then the command
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) set substitute-path /usr/src /mnt/cross
</pre></div>
<p>will tell <small>GDB</small> to replace &lsquo;<samp>/usr/src</samp>&rsquo; with
&lsquo;<samp>/mnt/cross</samp>&rsquo;, which will allow <small>GDB</small> to find the file
<samp>baz.c</samp> even though it was moved.
</p>
<p>In the case when more than one substitution rule have been defined,
the rules are evaluated one by one in the order where they have been
defined. The first one matching, if any, is selected to perform
the substitution.
</p>
<p>For instance, if we had entered the following commands:
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) set substitute-path /usr/src/include /mnt/include
(gdb) set substitute-path /usr/src /mnt/src
</pre></div>
<p><small>GDB</small> would then rewrite <samp>/usr/src/include/defs.h</samp> into
<samp>/mnt/include/defs.h</samp> by using the first rule. However, it would
use the second rule to rewrite <samp>/usr/src/lib/foo.c</samp> into
<samp>/mnt/src/lib/foo.c</samp>.
</p>
</dd>
<dt><code>unset substitute-path [path]</code></dt>
<dd><a name="index-unset-substitute_002dpath"></a>
<p>If a path is specified, search the current list of substitution rules
for a rule that would rewrite that path. Delete that rule if found.
A warning is emitted by the debugger if no rule could be found.
</p>
<p>If no path is specified, then all substitution rules are deleted.
</p>
</dd>
<dt><code>show substitute-path [path]</code></dt>
<dd><a name="index-show-substitute_002dpath"></a>
<p>If a path is specified, then print the source path substitution rule
which would rewrite that path, if any.
</p>
<p>If no path is specified, then print all existing source path substitution
rules.
</p>
</dd>
</dl>
<p>If your source path is cluttered with directories that are no longer of
interest, <small>GDB</small> may sometimes cause confusion by finding the wrong
versions of source. You can correct the situation as follows:
</p>
<ol>
<li> Use <code>directory</code> with no argument to reset the source path to its default value.
</li><li> Use <code>directory</code> with suitable arguments to reinstall the
directories you want in the source path. You can add all the
directories in one command.
</li></ol>
<hr>
<div class="header">
<p>
Next: <a href="Machine-Code.html#Machine-Code" accesskey="n" rel="next">Machine Code</a>, Previous: <a href="Search.html#Search" accesskey="p" rel="prev">Search</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>