2012-08-15 282 views
2

通常,我會像這樣在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 

回答

3

我認爲像下面應該爲你工作:

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

0

爲什麼不只是運行

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

1

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