| <html lang="en"> |
| <head> |
| <title>Server - 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="Remote-Debugging.html#Remote-Debugging" title="Remote Debugging"> |
| <link rel="prev" href="File-Transfer.html#File-Transfer" title="File Transfer"> |
| <link rel="next" href="Remote-Configuration.html#Remote-Configuration" title="Remote Configuration"> |
| <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="Server"></a> |
| <p> |
| Next: <a rel="next" accesskey="n" href="Remote-Configuration.html#Remote-Configuration">Remote Configuration</a>, |
| Previous: <a rel="previous" accesskey="p" href="File-Transfer.html#File-Transfer">File Transfer</a>, |
| Up: <a rel="up" accesskey="u" href="Remote-Debugging.html#Remote-Debugging">Remote Debugging</a> |
| <hr> |
| </div> |
| |
| <h3 class="section">20.3 Using the <code>gdbserver</code> Program</h3> |
| |
| <p><a name="index-gdbserver-1363"></a><a name="index-remote-connection-without-stubs-1364"></a><code>gdbserver</code> is a control program for Unix-like systems, which |
| allows you to connect your program with a remote <span class="sc">gdb</span> via |
| <code>target remote</code> or <code>target extended-remote</code>—but without |
| linking in the usual debugging stub. |
| |
| <p><code>gdbserver</code> is not a complete replacement for the debugging stubs, |
| because it requires essentially the same operating-system facilities |
| that <span class="sc">gdb</span> itself does. In fact, a system that can run |
| <code>gdbserver</code> to connect to a remote <span class="sc">gdb</span> could also run |
| <span class="sc">gdb</span> locally! <code>gdbserver</code> is sometimes useful nevertheless, |
| because it is a much smaller program than <span class="sc">gdb</span> itself. It is |
| also easier to port than all of <span class="sc">gdb</span>, so you may be able to get |
| started more quickly on a new system by using <code>gdbserver</code>. |
| Finally, if you develop code for real-time systems, you may find that |
| the tradeoffs involved in real-time operation make it more convenient to |
| do as much development work as possible on another system, for example |
| by cross-compiling. You can use <code>gdbserver</code> to make a similar |
| choice for debugging. |
| |
| <p><span class="sc">gdb</span> and <code>gdbserver</code> communicate via either a serial line |
| or a TCP connection, using the standard <span class="sc">gdb</span> remote serial |
| protocol. |
| |
| <blockquote> |
| <em>Warning:</em> <code>gdbserver</code> does not have any built-in security. |
| Do not run <code>gdbserver</code> connected to any public network; a |
| <span class="sc">gdb</span> connection to <code>gdbserver</code> provides access to the |
| target system with the same privileges as the user running |
| <code>gdbserver</code>. |
| </blockquote> |
| |
| <p><a name="Running-gdbserver"></a> |
| |
| <h4 class="subsection">20.3.1 Running <code>gdbserver</code></h4> |
| |
| <p><a name="index-arguments_002c-to-_0040code_007bgdbserver_007d-1365"></a><a name="index-g_t_0040code_007bgdbserver_007d_002c-command_002dline-arguments-1366"></a> |
| Run <code>gdbserver</code> on the target system. You need a copy of the |
| program you want to debug, including any libraries it requires. |
| <code>gdbserver</code> does not need your program's symbol table, so you can |
| strip the program if necessary to save space. <span class="sc">gdb</span> on the host |
| system does all the symbol handling. |
| |
| <p>To use the server, you must tell it how to communicate with <span class="sc">gdb</span>; |
| the name of your program; and the arguments for your program. The usual |
| syntax is: |
| |
| <pre class="smallexample"> target> gdbserver <var>comm</var> <var>program</var> [ <var>args</var> ... ] |
| </pre> |
| <p><var>comm</var> is either a device name (to use a serial line), or a TCP |
| hostname and portnumber, or <code>-</code> or <code>stdio</code> to use |
| stdin/stdout of <code>gdbserver</code>. |
| For example, to debug Emacs with the argument |
| ‘<samp><span class="samp">foo.txt</span></samp>’ and communicate with <span class="sc">gdb</span> over the serial port |
| <samp><span class="file">/dev/com1</span></samp>: |
| |
| <pre class="smallexample"> target> gdbserver /dev/com1 emacs foo.txt |
| </pre> |
| <p><code>gdbserver</code> waits passively for the host <span class="sc">gdb</span> to communicate |
| with it. |
| |
| <p>To use a TCP connection instead of a serial line: |
| |
| <pre class="smallexample"> target> gdbserver host:2345 emacs foo.txt |
| </pre> |
| <p>The only difference from the previous example is the first argument, |
| specifying that you are communicating with the host <span class="sc">gdb</span> via |
| TCP. The ‘<samp><span class="samp">host:2345</span></samp>’ argument means that <code>gdbserver</code> is to |
| expect a TCP connection from machine ‘<samp><span class="samp">host</span></samp>’ to local TCP port 2345. |
| (Currently, the ‘<samp><span class="samp">host</span></samp>’ part is ignored.) You can choose any number |
| you want for the port number as long as it does not conflict with any |
| TCP ports already in use on the target system (for example, <code>23</code> is |
| reserved for <code>telnet</code>).<a rel="footnote" href="#fn-1" name="fnd-1"><sup>1</sup></a> You must use the same port number with the host <span class="sc">gdb</span> |
| <code>target remote</code> command. |
| |
| <p>The <code>stdio</code> connection is useful when starting <code>gdbserver</code> |
| with ssh: |
| |
| <pre class="smallexample"> (gdb) target remote | ssh -T hostname gdbserver - hello |
| </pre> |
| <p>The ‘<samp><span class="samp">-T</span></samp>’ option to ssh is provided because we don't need a remote pty, |
| and we don't want escape-character handling. Ssh does this by default when |
| a command is provided, the flag is provided to make it explicit. |
| You could elide it if you want to. |
| |
| <p>Programs started with stdio-connected gdbserver have <samp><span class="file">/dev/null</span></samp> for |
| <code>stdin</code>, and <code>stdout</code>,<code>stderr</code> are sent back to gdb for |
| display through a pipe connected to gdbserver. |
| Both <code>stdout</code> and <code>stderr</code> use the same pipe. |
| |
| <p><a name="Attaching-to-a-program"></a> |
| |
| <h5 class="subsubsection">20.3.1.1 Attaching to a Running Program</h5> |
| |
| <p><a name="index-attach-to-a-program_002c-_0040code_007bgdbserver_007d-1367"></a><a name="index-g_t_0040option_007b_002d_002dattach_007d_002c-_0040code_007bgdbserver_007d-option-1368"></a> |
| On some targets, <code>gdbserver</code> can also attach to running programs. |
| This is accomplished via the <code>--attach</code> argument. The syntax is: |
| |
| <pre class="smallexample"> target> gdbserver --attach <var>comm</var> <var>pid</var> |
| </pre> |
| <p><var>pid</var> is the process ID of a currently running process. It isn't |
| necessary to point <code>gdbserver</code> at a binary for the running process. |
| |
| <p>In <code>target extended-remote</code> mode, you can also attach using the |
| <span class="sc">gdb</span> attach command |
| (see <a href="Attaching-in-Types-of-Remote-Connections.html#Attaching-in-Types-of-Remote-Connections">Attaching in Types of Remote Connections</a>). |
| |
| <p><a name="index-pidof-1369"></a>You can debug processes by name instead of process ID if your target has the |
| <code>pidof</code> utility: |
| |
| <pre class="smallexample"> target> gdbserver --attach <var>comm</var> `pidof <var>program</var>` |
| </pre> |
| <p>In case more than one copy of <var>program</var> is running, or <var>program</var> |
| has multiple threads, most versions of <code>pidof</code> support the |
| <code>-s</code> option to only return the first process ID. |
| |
| <h5 class="subsubsection">20.3.1.2 TCP port allocation lifecycle of <code>gdbserver</code></h5> |
| |
| <p>This section applies only when <code>gdbserver</code> is run to listen on a TCP |
| port. |
| |
| <p><code>gdbserver</code> normally terminates after all of its debugged processes have |
| terminated in <kbd>target remote</kbd> mode. On the other hand, for <kbd>target |
| extended-remote</kbd>, <code>gdbserver</code> stays running even with no processes left. |
| <span class="sc">gdb</span> normally terminates the spawned debugged process on its exit, |
| which normally also terminates <code>gdbserver</code> in the <kbd>target remote</kbd> |
| mode. Therefore, when the connection drops unexpectedly, and <span class="sc">gdb</span> |
| cannot ask <code>gdbserver</code> to kill its debugged processes, <code>gdbserver</code> |
| stays running even in the <kbd>target remote</kbd> mode. |
| |
| <p>When <code>gdbserver</code> stays running, <span class="sc">gdb</span> can connect to it again later. |
| Such reconnecting is useful for features like <a href="disconnected-tracing.html#disconnected-tracing">disconnected tracing</a>. For |
| completeness, at most one <span class="sc">gdb</span> can be connected at a time. |
| |
| <p><a name="index-g_t_0040option_007b_002d_002donce_007d_002c-_0040code_007bgdbserver_007d-option-1370"></a>By default, <code>gdbserver</code> keeps the listening TCP port open, so that |
| subsequent connections are possible. However, if you start <code>gdbserver</code> |
| with the <samp><span class="option">--once</span></samp> option, it will stop listening for any further |
| connection attempts after connecting to the first <span class="sc">gdb</span> session. This |
| means no further connections to <code>gdbserver</code> will be possible after the |
| first one. It also means <code>gdbserver</code> will terminate after the first |
| connection with remote <span class="sc">gdb</span> has closed, even for unexpectedly closed |
| connections and even in the <kbd>target extended-remote</kbd> mode. The |
| <samp><span class="option">--once</span></samp> option allows reusing the same port number for connecting to |
| multiple instances of <code>gdbserver</code> running on the same host, since each |
| instance closes its port after the first connection. |
| |
| <p><a name="Other-Command_002dLine-Arguments-for-gdbserver"></a> |
| |
| <h5 class="subsubsection">20.3.1.3 Other Command-Line Arguments for <code>gdbserver</code></h5> |
| |
| <p>You can use the <samp><span class="option">--multi</span></samp> option to start <code>gdbserver</code> without |
| specifying a program to debug or a process to attach to. Then you can |
| attach in <code>target extended-remote</code> mode and run or attach to a |
| program. For more information, |
| see <a href="_002d_002dmulti-Option-in-Types-of-Remote-Connnections.html#g_t_002d_002dmulti-Option-in-Types-of-Remote-Connnections">–multi Option in Types of Remote Connnections</a>. |
| |
| <p><a name="index-g_t_0040option_007b_002d_002ddebug_007d_002c-_0040code_007bgdbserver_007d-option-1371"></a>The <samp><span class="option">--debug</span></samp> option tells <code>gdbserver</code> to display extra |
| status information about the debugging process. |
| <a name="index-g_t_0040option_007b_002d_002dremote_002ddebug_007d_002c-_0040code_007bgdbserver_007d-option-1372"></a>The <samp><span class="option">--remote-debug</span></samp> option tells <code>gdbserver</code> to display |
| remote protocol debug output. These options are intended for |
| <code>gdbserver</code> development and for bug reports to the developers. |
| |
| <p><a name="index-g_t_0040option_007b_002d_002ddebug_002dformat_007d_002c-_0040code_007bgdbserver_007d-option-1373"></a>The <samp><span class="option">--debug-format=option1[,option2,...]</span></samp> option tells |
| <code>gdbserver</code> to include additional information in each output. |
| Possible options are: |
| |
| <dl> |
| <dt><code>none</code><dd>Turn off all extra information in debugging output. |
| <br><dt><code>all</code><dd>Turn on all extra information in debugging output. |
| <br><dt><code>timestamps</code><dd>Include a timestamp in each line of debugging output. |
| </dl> |
| |
| <p>Options are processed in order. Thus, for example, if <samp><span class="option">none</span></samp> |
| appears last then no additional information is added to debugging output. |
| |
| <p><a name="index-g_t_0040option_007b_002d_002dwrapper_007d_002c-_0040code_007bgdbserver_007d-option-1374"></a>The <samp><span class="option">--wrapper</span></samp> option specifies a wrapper to launch programs |
| for debugging. The option should be followed by the name of the |
| wrapper, then any command-line arguments to pass to the wrapper, then |
| <kbd>--</kbd> indicating the end of the wrapper arguments. |
| |
| <p><code>gdbserver</code> runs the specified wrapper program with a combined |
| command line including the wrapper arguments, then the name of the |
| program to debug, then any arguments to the program. The wrapper |
| runs until it executes your program, and then <span class="sc">gdb</span> gains control. |
| |
| <p>You can use any program that eventually calls <code>execve</code> with |
| its arguments as a wrapper. Several standard Unix utilities do |
| this, e.g. <code>env</code> and <code>nohup</code>. Any Unix shell script ending |
| with <code>exec "$@"</code> will also work. |
| |
| <p>For example, you can use <code>env</code> to pass an environment variable to |
| the debugged program, without setting the variable in <code>gdbserver</code>'s |
| environment: |
| |
| <pre class="smallexample"> $ gdbserver --wrapper env LD_PRELOAD=libtest.so -- :2222 ./testprog |
| </pre> |
| <p><a name="index-g_t_0040option_007b_002d_002dselftest_007d-1375"></a>The <samp><span class="option">--selftest</span></samp> option runs the self tests in <code>gdbserver</code>: |
| |
| <pre class="smallexample"> $ gdbserver --selftest |
| Ran 2 unit tests, 0 failed |
| </pre> |
| <p>These tests are disabled in release. |
| |
| <h4 class="subsection">20.3.2 Connecting to <code>gdbserver</code></h4> |
| |
| <p>The basic procedure for connecting to the remote target is: |
| <ul> |
| <li>Run <span class="sc">gdb</span> on the host system. |
| |
| <li>Make sure you have the necessary symbol files |
| (see <a href="Host-and-target-files.html#Host-and-target-files">Host and target files</a>). |
| Load symbols for your application using the <code>file</code> command before you |
| connect. Use <code>set sysroot</code> to locate target libraries (unless your |
| <span class="sc">gdb</span> was compiled with the correct sysroot using |
| <code>--with-sysroot</code>). |
| |
| <li>Connect to your target (see <a href="Connecting.html#Connecting">Connecting to a Remote Target</a>). |
| For TCP connections, you must start up <code>gdbserver</code> prior to using |
| the <code>target</code> command. Otherwise you may get an error whose |
| text depends on the host system, but which usually looks something like |
| ‘<samp><span class="samp">Connection refused</span></samp>’. Don't use the <code>load</code> |
| command in <span class="sc">gdb</span> when using <code>target remote</code> mode, since the |
| program is already on the target. |
| |
| </ul> |
| |
| <p><a name="Monitor-Commands-for-gdbserver"></a> |
| |
| <h4 class="subsection">20.3.3 Monitor Commands for <code>gdbserver</code></h4> |
| |
| <p><a name="index-monitor-commands_002c-for-_0040code_007bgdbserver_007d-1376"></a> |
| During a <span class="sc">gdb</span> session using <code>gdbserver</code>, you can use the |
| <code>monitor</code> command to send special requests to <code>gdbserver</code>. |
| Here are the available commands. |
| |
| <dl> |
| <dt><code>monitor help</code><dd>List the available monitor commands. |
| |
| <br><dt><code>monitor set debug 0</code><dt><code>monitor set debug 1</code><dd>Disable or enable general debugging messages. |
| |
| <br><dt><code>monitor set remote-debug 0</code><dt><code>monitor set remote-debug 1</code><dd>Disable or enable specific debugging messages associated with the remote |
| protocol (see <a href="Remote-Protocol.html#Remote-Protocol">Remote Protocol</a>). |
| |
| <br><dt><code>monitor set debug-format option1</code><span class="roman">[</span><code>,option2,...</code><span class="roman">]</span><dd>Specify additional text to add to debugging messages. |
| Possible options are: |
| |
| <dl> |
| <dt><code>none</code><dd>Turn off all extra information in debugging output. |
| <br><dt><code>all</code><dd>Turn on all extra information in debugging output. |
| <br><dt><code>timestamps</code><dd>Include a timestamp in each line of debugging output. |
| </dl> |
| |
| <p>Options are processed in order. Thus, for example, if <samp><span class="option">none</span></samp> |
| appears last then no additional information is added to debugging output. |
| |
| <br><dt><code>monitor set libthread-db-search-path [PATH]</code><dd><a name="index-gdbserver_002c-search-path-for-_0040code_007blibthread_005fdb_007d-1377"></a>When this command is issued, <var>path</var> is a colon-separated list of |
| directories to search for <code>libthread_db</code> (see <a href="Threads.html#Threads">set libthread-db-search-path</a>). If you omit <var>path</var>, |
| ‘<samp><span class="samp">libthread-db-search-path</span></samp>’ will be reset to its default value. |
| |
| <p>The special entry ‘<samp><span class="samp">$pdir</span></samp>’ for ‘<samp><span class="samp">libthread-db-search-path</span></samp>’ is |
| not supported in <code>gdbserver</code>. |
| |
| <br><dt><code>monitor exit</code><dd>Tell gdbserver to exit immediately. This command should be followed by |
| <code>disconnect</code> to close the debugging session. <code>gdbserver</code> will |
| detach from any attached processes and kill any processes it created. |
| Use <code>monitor exit</code> to terminate <code>gdbserver</code> at the end |
| of a multi-process mode debug session. |
| |
| </dl> |
| |
| <h4 class="subsection">20.3.4 Tracepoints support in <code>gdbserver</code></h4> |
| |
| <p><a name="index-tracepoints-support-in-_0040code_007bgdbserver_007d-1378"></a> |
| On some targets, <code>gdbserver</code> supports tracepoints, fast |
| tracepoints and static tracepoints. |
| |
| <p>For fast or static tracepoints to work, a special library called the |
| <dfn>in-process agent</dfn> (IPA), must be loaded in the inferior process. |
| This library is built and distributed as an integral part of |
| <code>gdbserver</code>. In addition, support for static tracepoints |
| requires building the in-process agent library with static tracepoints |
| support. At present, the UST (LTTng Userspace Tracer, |
| <a href="http://lttng.org/ust">http://lttng.org/ust</a>) tracing engine is supported. This support |
| is automatically available if UST development headers are found in the |
| standard include path when <code>gdbserver</code> is built, or if |
| <code>gdbserver</code> was explicitly configured using <samp><span class="option">--with-ust</span></samp> |
| to point at such headers. You can explicitly disable the support |
| using <samp><span class="option">--with-ust=no</span></samp>. |
| |
| <p>There are several ways to load the in-process agent in your program: |
| |
| <dl> |
| <dt><code>Specifying it as dependency at link time</code><dd> |
| You can link your program dynamically with the in-process agent |
| library. On most systems, this is accomplished by adding |
| <code>-linproctrace</code> to the link command. |
| |
| <br><dt><code>Using the system's preloading mechanisms</code><dd> |
| You can force loading the in-process agent at startup time by using |
| your system's support for preloading shared libraries. Many Unixes |
| support the concept of preloading user defined libraries. In most |
| cases, you do that by specifying <code>LD_PRELOAD=libinproctrace.so</code> |
| in the environment. See also the description of <code>gdbserver</code>'s |
| <samp><span class="option">--wrapper</span></samp> command line option. |
| |
| <br><dt><code>Using </code><span class="sc">gdb</span><code> to force loading the agent at run time</code><dd> |
| On some systems, you can force the inferior to load a shared library, |
| by calling a dynamic loader function in the inferior that takes care |
| of dynamically looking up and loading a shared library. On most Unix |
| systems, the function is <code>dlopen</code>. You'll use the <code>call</code> |
| command for that. For example: |
| |
| <pre class="smallexample"> (gdb) call dlopen ("libinproctrace.so", ...) |
| </pre> |
| <p>Note that on most Unix systems, for the <code>dlopen</code> function to be |
| available, the program needs to be linked with <code>-ldl</code>. |
| </dl> |
| |
| <p>On systems that have a userspace dynamic loader, like most Unix |
| systems, when you connect to <code>gdbserver</code> using <code>target |
| remote</code>, you'll find that the program is stopped at the dynamic |
| loader's entry point, and no shared library has been loaded in the |
| program's address space yet, including the in-process agent. In that |
| case, before being able to use any of the fast or static tracepoints |
| features, you need to let the loader run and load the shared |
| libraries. The simplest way to do that is to run the program to the |
| main procedure. E.g., if debugging a C or C<tt>++</tt> program, start |
| <code>gdbserver</code> like so: |
| |
| <pre class="smallexample"> $ gdbserver :9999 myprogram |
| </pre> |
| <p>Start GDB and connect to <code>gdbserver</code> like so, and run to main: |
| |
| <pre class="smallexample"> $ gdb myprogram |
| (gdb) target remote myhost:9999 |
| 0x00007f215893ba60 in ?? () from /lib64/ld-linux-x86-64.so.2 |
| (gdb) b main |
| (gdb) continue |
| </pre> |
| <p>The in-process tracing agent library should now be loaded into the |
| process; you can confirm it with the <code>info sharedlibrary</code> |
| command, which will list <samp><span class="file">libinproctrace.so</span></samp> as loaded in the |
| process. You are now ready to install fast tracepoints, list static |
| tracepoint markers, probe static tracepoints markers, and start |
| tracing. |
| |
| <div class="footnote"> |
| <hr> |
| <h4>Footnotes</h4><p class="footnote"><small>[<a name="fn-1" href="#fnd-1">1</a>]</small> If you choose a port number that |
| conflicts with another service, <code>gdbserver</code> prints an error message |
| and exits.</p> |
| |
| <hr></div> |
| |
| </body></html> |
| |