Next: Remote Configuration, Previous: File Transfer, Up: Remote Debugging [Contents][Index]
. IDEs: Many IDEs like NetBeans, Eclipse, CLion, Visual Studio have inbuilt debugger or provide integration with third-party debuggers for serial/multi-threaded applications If you have any question, suggestion or would like to improve the post with your favourite tool, I will be glad to hear!
Next, click the 'Serial Monitor' button or use the PlatformIO-Serial Monitor menu to display the serial monitor. First, select the serial port to connect to. On a Mac, this will always be named something like 'USB to UART Bridge'. On Windows, it will be named something like 'Com3'. Next, select the baud rate. All Clion-Marine products are prepared for easy Integration into a central monitoring system. Watch product video. Clion Marine ships-airconditioning is developed exclusively by Eberca, specialist in (mobile) climate-sytems, and is produced in the EU. This is not meant to program an arduino, it is meant to monitor the serial output, and give it input as well. Was this review helpful? The current arduino development workflow in CLion with serial monitor looks like: 1. Make code changes 2. Upload firmware 3. Connect serial monitor 5. Test stuff you wrote 6. Disconnect serial monitor. Go to 1 The 3rd and 6th items are very annoying but necessary because serial monitor and firmware upload tool (avrdude) cannot use the port simultaneously (can they?).
20.3 Using the gdbserver
Program
gdbserver
is a control program for Unix-like systems, whichallows you to connect your program with a remote GDB viatarget remote
or target extended-remote
—but withoutlinking in the usual debugging stub.
gdbserver
is not a complete replacement for the debugging stubs,because it requires essentially the same operating-system facilitiesthat GDB itself does. In fact, a system that can rungdbserver
to connect to a remote GDB could also runGDB locally! gdbserver
is sometimes useful nevertheless,because it is a much smaller program than GDB itself. It isalso easier to port than all of GDB, so you may be able to getstarted more quickly on a new system by using gdbserver
.Finally, if you develop code for real-time systems, you may find thatthe tradeoffs involved in real-time operation make it more convenient todo as much development work as possible on another system, for exampleby cross-compiling. You can use gdbserver
to make a similarchoice for debugging.
GDB and gdbserver
communicate via either a serial lineor a TCP connection, using the standard GDB remote serialprotocol.
Warning:gdbserver
does not have any built-in security.Do not run gdbserver
connected to any public network; aGDB connection to gdbserver
provides access to thetarget system with the same privileges as the user runninggdbserver
.
20.3.1 Running gdbserver
Run gdbserver
on the target system. You need a copy of theprogram you want to debug, including any libraries it requires.gdbserver
does not need your program’s symbol table, so you canstrip the program if necessary to save space. GDB on the hostsystem does all the symbol handling.
To use the server, you must tell it how to communicate with GDB;the name of your program; and the arguments for your program. The usualsyntax is:
comm is either a device name (to use a serial line), or a TCPhostname and portnumber, or -
or stdio
to usestdin/stdout of gdbserver
.For example, to debug Emacs with the argument‘foo.txt’ and communicate with GDB over the serial port/dev/com1:
gdbserver
waits passively for the host GDB to communicatewith it.
To use a TCP connection instead of a serial line:
The only difference from the previous example is the first argument,specifying that you are communicating with the host GDB viaTCP. The ‘host:2345’ argument means that gdbserver
is toexpect a TCP connection from machine ‘host’ to local TCP port 2345.(Currently, the ‘host’ part is ignored.) You can choose any numberyou want for the port number as long as it does not conflict with anyTCP ports already in use on the target system (for example, 23
isreserved for telnet
).16 You must use the same port number with the host GDBtarget remote
command.
The stdio
connection is useful when starting gdbserver
with ssh:
The ‘-T’ 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 whena command is provided, the flag is provided to make it explicit.You could elide it if you want to.
Programs started with stdio-connected gdbserver have /dev/null forstdin
, and stdout
,stderr
are sent back to gdb fordisplay through a pipe connected to gdbserver.Both stdout
and stderr
use the same pipe.
20.3.1.1 Attaching to a Running Program
On some targets, gdbserver
can also attach to running programs.This is accomplished via the --attach
argument. The syntax is:
pid is the process ID of a currently running process. It isn’tnecessary to point gdbserver
at a binary for the running process.
In target extended-remote
mode, you can also attach using theGDB attach command(see Attaching in Types of Remote Connections).
You can debug processes by name instead of process ID if your target has thepidof
utility:
In case more than one copy of program is running, or programhas multiple threads, most versions of pidof
support the-s
option to only return the first process ID.
20.3.1.2 TCP Port Allocation Lifecycle of gdbserver
This section applies only when gdbserver
is run to listen on a TCPport.
gdbserver
normally terminates after all of its debugged processes haveterminated in target remote mode. On the other hand, for targetextended-remote, gdbserver
stays running even with no processes left.GDB normally terminates the spawned debugged process on its exit,which normally also terminates gdbserver
in the target remotemode. Therefore, when the connection drops unexpectedly, and GDBcannot ask gdbserver
to kill its debugged processes, gdbserver
stays running even in the target remote mode.
When gdbserver
stays running, GDB can connect to it again later.Such reconnecting is useful for features like disconnected tracing. Forcompleteness, at most one GDB can be connected at a time.
By default, gdbserver
keeps the listening TCP port open, so thatsubsequent connections are possible. However, if you start gdbserver
with the --once option, it will stop listening for any furtherconnection attempts after connecting to the first GDB session. Thismeans no further connections to gdbserver
will be possible after thefirst one. It also means gdbserver
will terminate after the firstconnection with remote GDB has closed, even for unexpectedly closedconnections and even in the target extended-remote mode. The--once option allows reusing the same port number for connecting tomultiple instances of gdbserver
running on the same host, since eachinstance closes its port after the first connection.
20.3.1.3 Other Command-Line Arguments for gdbserver
You can use the --multi option to start gdbserver
withoutspecifying a program to debug or a process to attach to. Then you canattach in target extended-remote
mode and run or attach to aprogram. For more information,see --multi Option in Types of Remote Connnections.
The --debug option tells gdbserver
to display extrastatus information about the debugging process.The --remote-debug option tells gdbserver
to displayremote protocol debug output.The --debug-file=filename option tells gdbserver
towrite any debug output to the given filename. These options are intendedfor gdbserver
development and for bug reports to the developers.
The --debug-format=option1[,option2,...] option tellsgdbserver
to include additional information in each output.Possible options are:
none
Turn off all extra information in debugging output.
all
Turn on all extra information in debugging output.
timestamps
Include a timestamp in each line of debugging output.
Options are processed in order. Thus, for example, if noneappears last then no additional information is added to debugging output.
The --wrapper option specifies a wrapper to launch programsfor debugging. The option should be followed by the name of thewrapper, then any command-line arguments to pass to the wrapper, then-- indicating the end of the wrapper arguments.
gdbserver
runs the specified wrapper program with a combinedcommand line including the wrapper arguments, then the name of theprogram to debug, then any arguments to the program. The wrapperruns until it executes your program, and then GDB gains control.
You can use any program that eventually calls execve
withits arguments as a wrapper. Several standard Unix utilities dothis, e.g. env
and nohup
. Any Unix shell script endingwith exec '$@'
will also work.
For example, you can use env
to pass an environment variable tothe debugged program, without setting the variable in gdbserver
’senvironment:
The --selftest option runs the self tests in gdbserver
:
These tests are disabled in release.
20.3.2 Connecting to gdbserver
The basic procedure for connecting to the remote target is:
- Run GDB on the host system.
- Make sure you have the necessary symbol files(see Host and target files).Load symbols for your application using the
file
command before youconnect. Useset sysroot
to locate target libraries (unless yourGDB was compiled with the correct sysroot using--with-sysroot
). - Connect to your target (see Connecting to a Remote Target).For TCP connections, you must start up
gdbserver
prior to usingthetarget
command. Otherwise you may get an error whosetext depends on the host system, but which usually looks something like‘Connection refused’. Don’t use theload
command in GDB when usingtarget remote
mode, since theprogram is already on the target.
20.3.3 Monitor Commands for gdbserver
During a GDB session using gdbserver
, you can use themonitor
command to send special requests to gdbserver
.Here are the available commands.
monitor help
List the available monitor commands.
monitor set debug 0
monitor set debug 1
Disable or enable general debugging messages.
monitor set remote-debug 0
monitor set remote-debug 1
Clion Platformio Serial Monitor
Disable or enable specific debugging messages associated with the remoteprotocol (see Remote Protocol).
monitor set debug-file filename
monitor set debug-file
Send any debug output to the given file, or to stderr.
monitor set debug-format option1[,option2,...]
Specify additional text to add to debugging messages.Possible options are:
none
Turn off all extra information in debugging output.
all
Turn on all extra information in debugging output.
timestamps
Include a timestamp in each line of debugging output.
Options are processed in order. Thus, for example, if noneappears last then no additional information is added to debugging output.
monitor set libthread-db-search-path [PATH]
When this command is issued, path is a colon-separated list ofdirectories to search for libthread_db
(see setlibthread-db-search-path). If you omit path,‘libthread-db-search-path’ will be reset to its default value.
The special entry ‘$pdir’ for ‘libthread-db-search-path’ isnot supported in gdbserver
.
monitor exit
Tell gdbserver to exit immediately. This command should be followed bydisconnect
to close the debugging session. gdbserver
willdetach from any attached processes and kill any processes it created.Use monitor exit
to terminate gdbserver
at the endof a multi-process mode debug session.
20.3.4 Tracepoints Support in gdbserver
On some targets, gdbserver
supports tracepoints, fasttracepoints and static tracepoints.
For fast or static tracepoints to work, a special library called thein-process agent (IPA), must be loaded in the inferior process.This library is built and distributed as an integral part ofgdbserver
. In addition, support for static tracepointsrequires building the in-process agent library with static tracepointssupport. At present, the UST (LTTng Userspace Tracer,http://lttng.org/ust) tracing engine is supported. This supportis automatically available if UST development headers are found in thestandard include path when gdbserver
is built, or ifgdbserver
was explicitly configured using --with-ustto point at such headers. You can explicitly disable the supportusing --with-ust=no.
There are several ways to load the in-process agent in your program:
Specifying it as dependency at link time
You can link your program dynamically with the in-process agentlibrary. On most systems, this is accomplished by adding-linproctrace
to the link command.
Using the system's preloading mechanisms
You can force loading the in-process agent at startup time by usingyour system’s support for preloading shared libraries. Many Unixessupport the concept of preloading user defined libraries. In mostcases, you do that by specifying LD_PRELOAD=libinproctrace.so
in the environment. See also the description of gdbserver
’s--wrapper command line option.
Using GDB to force loading the agent at run time
Clion Serial Monitor Download
On some systems, you can force the inferior to load a shared library,by calling a dynamic loader function in the inferior that takes careof dynamically looking up and loading a shared library. On most Unixsystems, the function is dlopen
. You’ll use the call
command for that. For example:
Note that on most Unix systems, for the dlopen
function to beavailable, the program needs to be linked with -ldl
.
On systems that have a userspace dynamic loader, like most Unixsystems, when you connect to gdbserver
using targetremote
, you’ll find that the program is stopped at the dynamicloader’s entry point, and no shared library has been loaded in theprogram’s address space yet, including the in-process agent. In thatcase, before being able to use any of the fast or static tracepointsfeatures, you need to let the loader run and load the sharedlibraries. The simplest way to do that is to run the program to themain procedure. E.g., if debugging a C or C++ program, startgdbserver
like so:
Start GDB and connect to gdbserver
like so, and run to main:
The in-process tracing agent library should now be loaded into theprocess; you can confirm it with the info sharedlibrary
command, which will list libinproctrace.so as loaded in theprocess. You are now ready to install fast tracepoints, list statictracepoint markers, probe static tracepoints markers, and starttracing.
Footnotes
(16)
If you choose a port number thatconflicts with another service, gdbserver
prints an error messageand exits.
Next: Remote Configuration, Previous: File Transfer, Up: Remote Debugging [Contents][Index]
Comments are closed.