【发布时间】:2012-09-28 14:57:56
【问题描述】:
主要问题:
puts 语句(尽管是硬编码字符串)如何影响程序流程?
我将直接研究不完整的代码片段,原因将在后面解释。
proc bgerror { error } {
puts "Background error: $error"
exit 1
}
运行我的 Tcl 程序,我得到:
Background error: can't read "YPE(PROCESS)": no such variable
很公平,我想;一定是在某处搞砸了$ 或括号。为了找到问题,我将puts 语句放在各处并重新运行程序。
然而这一次,我的程序崩溃了:
9526: tclsh testProgram
fffffd7ffeafebba waitid (0, 253d, fffffd7fffdf4950, 3)
fffffd7ffeaeff9d waitpid () + 7d
fffffd7ffe635132 __1cPGetPstackOutput6Fiiipci_v_ () + b2
fffffd7ffe634bfb App_CoreSignalHandler () + 76b
fffffd7ffeafb7b6 __sighndlr () + 6
fffffd7ffeaf0b82 call_user_handler () + 252
fffffd7ffeaf0d68 sigacthandler (b, fffffd7fffdfa500, fffffd7fffdfa1a0) + a8
--- called from signal handler with signal 11 (SIGSEGV) ---
哎哟。
最后,我发现了一件非常奇怪的事情:
proc OnNewState { } {
puts "foobar"
# ...
}
使用 puts 声明,我得到了崩溃。 没有它,我得到原来的错误。 (嗯?!)我来回翻了很多次,以确保它是确定性的——确实如此。
现在,我一头扎进不完整的代码片段的原因是我想把注意力集中在抽象上,而不是细节上。
(完整的代码复杂且不透明,主要利用我公司的基础设施库,因此无论如何简化它以使其易于理解是不切实际的。此外,我已经知道问题源于基础设施库之一,因为当我删除一些与 TCP 发布者/订阅者堆栈库相关联的代码时,问题就消失了。)
puts 语句(尽管是硬编码字符串)如何影响程序流程?
即使我开始深入研究相关库的 C 源代码,我也不知道要查找什么。
希望有经验的 Tcl'ers 能有所启发...
【问题讨论】:
-
我能想到的一件事是
puts与解释器的“结果对象”混淆了。理论上,如果您的 Tcl 库以某种方式不正确地访问它,这将解释崩溃。在任何情况下,我都会尝试生成 Tcl 运行时的适当回溯,并尝试在comp.lang.tcl上获得帮助。