So, I’m doing some development on a Cortex M3-based device with access to only one serial port, and that serial port is doing double-duty as serial console and polling a Modbus energy meter. How do I get log messages out?
My code actually implements the stubs to direct stdout
and stderr
transparently to the serial port, however this has to go to /dev/null
when the Modbus port is in use. That said, _write_r
still gets called, in my code, it is possible to set a breakpoint inside the _write_r
function when traffic is identified for the console.
As it happens, gdb
can be told to not only break there, but to perform a series of actions. In my case serial.c:659
is the file and line number inside an if branch that handles the console code. Setting up gdb
to print this data out requires the following statements:
(gdb) break serial.c:659 (gdb) commands Type commands for breakpoint(s) 3, one per line. End with a line saying just "end". >set ((char*)buf)[cnt] = 0 >print (char*)buf >continue >end (gdb) c
The result:
Breakpoint 3, _write_r (ptr=, fd=0, buf=0x200068c0, cnt=78) at /home/stuartl/vrt/projects/widesky/hub/hal/src/serial.c:659 659 if (serial_console_target.port) { $51 = 0x200068c0 "/home/stuartl/vrt/projects/widesky/hub/hal/demo/main.c:226 Registration sent\r\n" Breakpoint 3, _write_r (ptr= , fd=0, buf=0x200068c0, cnt=46) at /home/stuartl/vrt/projects/widesky/hub/hal/src/serial.c:659 659 if (serial_console_target.port) { $52 = 0x200068c0 "Received NTP time is Mon Nov 6 04:13:41 2017\n" Breakpoint 3, _write_r (ptr= , fd=0, buf=0x200068c0, cnt=2) at /home/stuartl/vrt/projects/widesky/hub/hal/src/serial.c:659 659 if (serial_console_target.port) { $53 = 0x200068c0 "\r\n" Breakpoint 3, _write_r (ptr= , fd=0, buf=0x200068c0, cnt=89) at /home/stuartl/vrt/projects/widesky/hub/hal/src/serial.c:659 659 if (serial_console_target.port) { $54 = 0x200068c0 "/home/stuartl/vrt/projects/widesky/hub/hal/demo/main.c:115 Registration timeout: 30 sec\r\n" Breakpoint 3, _write_r (ptr= , fd=0, buf=0x200068c0, cnt=83) at /home/stuartl/vrt/projects/widesky/hub/hal/src/serial.c:659 659 if (serial_console_target.port) { $55 = 0x200068c0 "/home/stuartl/vrt/projects/widesky/hub/hal/demo/main.c:130 Select source address:\r\n" Breakpoint 3, _write_r (ptr= , fd=0, buf=0x200068c0, cnt=53) at /home/stuartl/vrt/projects/widesky/hub/hal/src/serial.c:659 659 if (serial_console_target.port) { $56 = 0x200068c0 " ? fdde:ad00:beef:0:0:ff:fe00:a400 Pref=Y Valid=Y\r\n" Breakpoint 3, _write_r (ptr= , fd=0, buf=0x200068c0, cnt=15) at /home/stuartl/vrt/projects/widesky/hub/hal/src/serial.c:659 659 if (serial_console_target.port) { $57 = 0x200068c0 " ? Selected\r\n" ---Type to continue, or q to quit--- Breakpoint 3, _write_r (ptr= , fd=0, buf=0x200068c0, cnt=78) at /home/stuartl/vrt/projects/widesky/hub/hal/src/serial.c:659 659 if (serial_console_target.port) { $58 = 0x200068c0 "/home/stuartl/vrt/projects/widesky/hub/hal/demo/main.c:226 Registration sent\r\n"
Not as nice as having a dedicated port, but better than nothing.
Recent Comments