Websh通过mod_websh可以作为Apache的一个模块使用。但Apache的多线程模型也带来一些编译和使用上的问题。
这些问题在单独使用libwebsh或者websh的时候则不存在。
> [error] web::interpmap: out of stack space (infinite loop?) > > [error] [client 172.17.164.111] mod_websh - nointerp!
Some suggestion: "recompiled Tcl with -DTCL_NO_STACK_CHECK"
对于Apache 2,需要Tcl编译时--enable-thread
选项支持。
检查"tclConfig.sh"可以查看相关编译选项。
tclAppInit.o: In function `Tcl_AppInit': /.../websh-3.6.0b5/src/unix/../generic/tclAppInit.c:173: undefined reference to `Websh_Init'
objdump
输出符号表里, 'Websh_Init'被标记为".hidden"。
Your Tcl 8.6 'tclConfig.sh' comes with a "-fvisibility=hidden" 编译选项。
TCL_EXTRA_CFLAGS=' -pipe -fvisibility=hidden '
去掉该选项后顺利编译成功。
Websh 3.6.0b5 中的 mod_websh 与 Tcl8.6 一起使用时,使用时碰到以下错误:
Tcl_AsyncDelete: async handler deleted by the wrong thread
导致Apache进程退出。
经过调试,实际上这是由于Tcl8.6在删除解释器(Tcl_DeleteInterp)时会调用Tcl_AsyncDelete
以对应创建解释器(Tcl_CreateInterp)时的Tcl_AsyncCreate
。而Tcl_AsyncDelete
会检查Tcl_AsyncCreate
时保存的线程ID,不一致则直接Tcl_Panic
退出。
解决办法:
自己修改过的Websh代码:https://github.com/noyesno/tcl-websh