firmware-base/vendor/sming/Sming/docs/source/debugging/esp8266.rst
2026-01-28 16:42:43 +01:00

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