[gambit-list] segfault when ,q from embedded web-repl

Marc Feeley feeley at iro.umontreal.ca
Thu Jun 3 22:01:36 EDT 2010


On 2010-05-25, at 2:14 PM, Emit Sorrels wrote:

> Hello,
> 
> I'm experimenting with Gambit as an embedded scripting engine 
> (to replace a Lua-based one) inside a large application written in C.
> For the most part, the scm<->c interop is working well for my use-case.
> 
> I would now like to add a remote REPL for debugging and changing 
> application logic on the fly. I added examples//web-repl.scm
> into my app and exposed start-repl-server within a c-define.
> 
> Surprisingly it works, but I notice that if I do ,q or ,qt the application segfaults.
> gdb bt is no help
> #0  0x00007ffff742c2b8 in siglongjmp () from /lib/libc.so.6
> #1  0x00000000004c0f3c in ___call ()
> #2  0x00000000004bff3e in start_repltest ()
> #3  0x00000000004c0060 in main ()

How exactly do you start the Scheme code?  Ideally you should model your main program along the lines of lib/_setup.c .  The important part is to delimit the C code which calls Scheme code inside a ___BEGIN_TRY and ___END_TRY pair so that exceptions (such as the one which is used to terminate the process when you enter ,q) will be caught, i.e.:

  ___BEGIN_TRY
  scheme_proc(1,2,3); // call Scheme procedure (defined using c-define)
  ___END_TRY

Moreover, if you want to catch Scheme exceptions in all REPL threads created, then you should set the right flags in setup_params.debug_settings .  So the main function of your program will be:

int main (int argc, char **argv)
{
  ___setup_params_struct setup_params;
  ___setup_params_reset (&setup_params);

  setup_params.version = ___VERSION;
  setup_params.linker  = SCHEME_LIBRARY_LINKER;
  setup_params.debug_settings = (___DEBUG_SETTINGS_UNCAUGHT_ALL
                                 << ___DEBUG_SETTINGS_UNCAUGHT_SHIFT) |
                                (___DEBUG_SETTINGS_ERROR_REPL
                                 << ___DEBUG_SETTINGS_ERROR_SHIFT);

  ___setup (&setup_params);

  {
    ___SCMOBJ ___err;
    ___processor_state ___ps = ___PSTATE;

    ___BEGIN_TRY

    start_repltest();

    ___END_TRY
  }

  ___cleanup ();

  return 0;
}


> 
> Also, the application no longer responds to ctrl-c.

It turns out that there were a few bugs in the implementation of the telnet protocol in example/web-repl.scm .  I've attached a corrected repltest.scm file which fixes the problem.  Now each REPL created will have its own thread-group and a CTRL-C at a REPL will interrupt all threads in that thread group.

Let me know if that works out for you.

Marc

-------------- next part --------------
A non-text attachment was scrubbed...
Name: main.c
Type: application/octet-stream
Size: 885 bytes
Desc: not available
URL: <http://mailman.iro.umontreal.ca/pipermail/gambit-list/attachments/20100603/981c7279/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: repltest.scm
Type: application/octet-stream
Size: 4371 bytes
Desc: not available
URL: <http://mailman.iro.umontreal.ca/pipermail/gambit-list/attachments/20100603/981c7279/attachment-0001.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: repltest.h
Type: application/octet-stream
Size: 31 bytes
Desc: not available
URL: <http://mailman.iro.umontreal.ca/pipermail/gambit-list/attachments/20100603/981c7279/attachment-0002.obj>


More information about the Gambit-list mailing list