[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