如何使用参数在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 
+0

“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

+0

当你在gdb下运行tclsh时,你应该得到标准的(gdb)命令提示符。你应该能够在这里设置断点,然后用指定的参数运行程序。 – Jackson 2012-08-15 12:36:58

为什么不只是运行

gdb --args tclsh8.5 mytest.tcl -opt1 foo -opt2 bar 

当你需要调试应用程序?

+0

因为我需要设置断点,或者它会直接执行并终止。 – Stan 2012-08-15 14:10:35

+1

gdb将以交互模式启动。您可以设置断点并继续使用“运行”命令。 – GrAnd 2012-08-15 15:34:41

如果您在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