如何使用参数在tchsh中执行tcl脚本
问题描述:
通常,我会像这样在shell下调用我的tcl脚本。如何使用参数在tchsh中执行tcl脚本
> tclsh8.5 mytest.tcl -opt1 foo -opt2 bar
在需要启动gdb进行调试的情况下,由于某些模块在C++中实现。我必须通过gdb启动tclsh。所以问题是如何用参数在tcl sh中执行我的脚本。
我需要这样的东西:
tclsh> run mytest.tcl -opt1 foo -opt2 bar
使用EXEC是不理想的,因为它的乡亲另一个进程和损失我的断点设置。
tclsh> exec mytest.tcl -opt1 foo -opt2 bar
答
我认为像下面应该为你工作:
set argv [list -opt1 foo -opt2 bar]
set argc 4
source mytest.tcl
所以设置的argv和ARGC获得的参数正确,然后就源的Tcl的代码来执行。
或者,gdb run命令允许您将命令行参数传递给要调试的可执行文件。所以如果你的调试tclsh那么运行命令的问题如下?
run mytest.tcl -opt1 foo -opt2 bar
例如在cygwin下我能够做到以下几点:
$ tclsh test.tcl
This is a test
$ gdb -q tclsh.exe
(no debugging symbols found)
(gdb) run test.tcl
Starting program: /usr/bin/tclsh.exe test.tcl
答
如果您在gdb会话中运行tclsh并设置参数,则可以这样做($
是shell提示符,(gdb)
是gdb提示符,而我省略了由gdb打印的所有消息) :
$ gdb tclsh
(gdb) set args mytest.tcl -opt1 foo -opt2 bar
(gdb) ... set some breakpoints ...
(gdb) run
您可能还需要set env FOO=bar
来设置环境,这取决于在你的脚本怎么回事。在调试测试套件的运行时,Tcl自己的构建文件使用这样的技术来传递参数。
+0
啊,我没有设置env FOO = bar。这就是我的断点从未被触发,因为它附加到发布版本。 – Stan 2012-08-15 15:28:59
“run mytest.tcl -opt1 foo ...”看起来不错。我该如何在gdb中做到这一点? (gdb)break myCppCode.cc:123(使未来的lib加载时使bp等待) 4.(gdb)break myCppCode.cc:123(gdb) )继续 5.从头开始? (y或n)我应该在这里做什么?如果选择“是”,那么它不会停在断点处。如果选择“否”,它将切换回tclsh并不执行任何操作。有什么遗漏吗? – Stan 2012-08-15 10:22:23
当你在gdb下运行tclsh时,你应该得到标准的(gdb)命令提示符。你应该能够在这里设置断点,然后用指定的参数运行程序。 – Jackson 2012-08-15 12:36:58