[RTEMS Project] #4740: Teach libdebugger to wait for GDB to connect and ask to continue

RTEMS trac trac at rtems.org
Thu Oct 13 09:51:53 UTC 2022


#4740: Teach libdebugger to wait for GDB to connect and ask to continue
-------------------------------+-------------------------
  Reporter:  Kévin Le Gouguec  |      Owner:  Chris Johns
      Type:  enhancement       |     Status:  assigned
  Priority:  normal            |  Milestone:
 Component:  lib/debugger      |    Version:
  Severity:  normal            |   Keywords:
Blocked By:                    |   Blocking:
-------------------------------+-------------------------
 In #4739, Chris noted this snippet in the reproducer:

 {{{
 #!c
 /* Debugger lock, there is no way to ask the libdebugger to wait for a
  * connection, that would block the kernel.  Instead use the following
 global
  * variable and 'set release_debugger = 1' in GDB when ready.  */
 volatile int release_debugger = 0;

 static void start_gdb_server(void)
 {
   rtems_printer printer;
   int r;

   rtems_print_printer_fprintf(&printer, stdout);
   r = rtems_debugger_register_tcp_remote();
   if (r < 0) {
     perror("TCP remote register");
     abort();
   }

   r = rtems_debugger_start("tcp", "1122", 3, 1, &printer);
   if (r < 0) {
     perror("can't start debugger");
     abort();
   }

   /* Definitely not nice, but it doesn't seem like there is any other
 choice
    * for libdebugger based debugging.  GDB just has to setup and only then
    * set release_debugger variable.  */
   while (!release_debugger) {
     sleep(0.1);
   }
 }
 }}}

 Chris suggests adding an option to make libdebugger halt execution until
 GDB connects and sends a "continue", which would make the debugging
 experience similar to targeting QEMU with the -S (uppercase S) switch:

 https://www.qemu.org/docs/master/system/gdb.html#gdb-usage

 We would appreciate that option very much, as it would make our testsuite
 support code for RTEMS more akin to other platforms by getting rid of that
 release_debugger variable.

 The API has yet to be defined:

 > > Don't know how that would translate in terms of API (adding an
 argument to rtems_debugger_start, if breaking the API is allowed; adding a
 function to request the wait after rtems_debugger_start has been called;
 …);
 >
 > I think breaking the API may be worth the short term pain. I tend to
 prefer a `const char* option` type argument that can be `NULL`. That
 argument can then be passed around and parsed by backends, transports etc
 and options can come and go without breaking the API.

 I know some programmers feel strongly against so-called "stringly-typed"
 APIs (e.g. they subvert type-checking; they require "𝖕𝖆𝖗𝖘𝖎𝖓𝖌"), but I've
 seen [https://flak.tedunangst.com/post/string-interfaces reasonable cases]
 for them; FWIW I do not have a clear preference for or against them in
 this context (C type-checking is a bit of a joke so not much is lost;
 parsing can be fraught but libdebugger probably does not belong in a
 critical stack anyway).

 So I'll trust your judgment on this!

 Again, thanks for suggesting this.

--
Ticket URL: <http://devel.rtems.org/ticket/4740>
RTEMS Project <http://www.rtems.org/>
RTEMS Project


More information about the bugs mailing list