127 lines
3.5 KiB
ReStructuredText
127 lines
3.5 KiB
ReStructuredText
Debugging on ESP8266
|
|
====================
|
|
|
|
Recompilation is required
|
|
-------------------------
|
|
|
|
In order to debug applications based on Sming Framework make sure that
|
|
you are using Sming version 4 or newer.
|
|
|
|
To use, (re)compile your application with the :envvar:`ENABLE_GDB` option and
|
|
flash it to the board. For this example we will use the :sample:`LiveDebug`
|
|
sample application::
|
|
|
|
cd $SMING_HOME/../samples/LiveDebug
|
|
make components-clean # -- required if you need to debug inside framework or libraries
|
|
make ENABLE_GDB=1 # -- recompiles your application with debugging support
|
|
make flashapp # flashes ONLY the (re)compiled application
|
|
|
|
The device will restart then wait for a debugger to be connected::
|
|
|
|
make gdb
|
|
|
|
This will start a new debugging session where you can run your code interactively::
|
|
|
|
Remote debugging using /dev/ttyUSB0
|
|
gdbstub_init () at /home/slavey/dev/esp8266.dev.box/dev/Sming/Sming//gdb/gdbstub.cpp:914
|
|
914 gdb_do_break();
|
|
(gdb)
|
|
|
|
If the debugger is exited, the application will continue execution as normal.
|
|
Re-connecting the debugger will pause execution.
|
|
|
|
|
|
GDB commands
|
|
------------
|
|
|
|
There are multiple commands supported in GDB and we will mention only some of them.
|
|
|
|
List current source code
|
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
One possibility is to see the source code of the current line where the
|
|
execution has stopped. To achieve this you should type ``list`` in the gdb
|
|
console::
|
|
|
|
(gdb) list
|
|
909 SD(GDBSTUB_ENABLE_HOSTIO);
|
|
910 #undef SD
|
|
911
|
|
912 #if GDBSTUB_BREAK_ON_INIT
|
|
913 if(gdb_state.enabled) {
|
|
914 gdb_do_break();
|
|
915 }
|
|
916 #endif
|
|
917 }
|
|
918
|
|
|
|
Break the execution
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
This command will pause the debugger once it reaches a specific function
|
|
or line in the code. This is called ``breakpoint`` and can be set like this::
|
|
|
|
(gdb) break blink
|
|
Breakpoint 1 at 0x40105d4c: file app/application.cpp, line 66.
|
|
|
|
Notice: ``break`` sets a software breakpoint. This means that the
|
|
``blink`` function must be in IRAM. Otherwise the execution will fail.
|
|
If you take a look at :source:`samples/LiveDebug/app/application.cpp#L663`,
|
|
you will see a in the definition of the ``init`` function the following
|
|
attribute ``GDB_IRAM_ATTR``::
|
|
|
|
void GDB_IRAM_ATTR init()
|
|
|
|
This attribute is used to put the ``init`` function in IRAM when the
|
|
code is compiled with the ``ENABLE_GDB=1`` directive.
|
|
|
|
Continue the execution
|
|
~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
To continue the execution of the application we can use the ``continue``
|
|
command::
|
|
|
|
(gdb) continue
|
|
Continuing.
|
|
LiveDebug sample
|
|
Explore some capabilities of the GDB debugger.
|
|
|
|
[OS] mode : sta..
|
|
...
|
|
[OS] cnt
|
|
|
|
Breakpoint 1, blink () at app/application.cpp:66
|
|
66 {
|
|
(gdb)
|
|
|
|
Because we have set already a breakpoint for the ``blink`` function the
|
|
execution will be paused when the ``blink`` function is reached and from
|
|
here you can go to the next line or see the current values of the
|
|
variables.
|
|
|
|
Go to the next line
|
|
~~~~~~~~~~~~~~~~~~~
|
|
|
|
This can be done using ``next``::
|
|
|
|
(gdb) next
|
|
67 digitalWrite(LED_PIN, ledState);
|
|
|
|
See variable value
|
|
~~~~~~~~~~~~~~~~~~
|
|
|
|
The command to see a value is ``print`` followed by the name of the
|
|
value. For example to see the value of the ``ledState`` variable inside
|
|
the ``blink`` function we could type::
|
|
|
|
(gdb) print ledState
|
|
$1 = true
|
|
|
|
You can see more useful commands :ref:`here <useful-gdb-commands>`.
|
|
|
|
Or watch the following short video
|
|
|
|
.. image:: https://img.youtube.com/vi/hVwSX_7Ey8c/3.jpg
|
|
:target: https://www.youtube.com/watch?v=hVwSX_7Ey8c
|
|
|