我想對於用ns來**的人來說,很重要的乙個問題就是除錯,因為並沒有像vc那樣方便的整合的除錯環境。《ns與網路模擬》的書中介紹了tcl debug和kdevelop除錯的方法,這裡主要介紹gdb除錯的方法。因為偶個人第一次寫ns**除錯用的就是gdb,感覺安裝使用都很方便,這裡簡單介紹一下:
2.修改makefile,新增除錯資訊,即ccopt = -g//(後面可能還有其他引數,保留),其實就是在ns編譯的時候gcc後面新增-g選項。
3.重新編譯ns2:make clean,make depend然後make
我make的時候indep-utils/webtrace-conv/dex/proxytrac2any.cc出了宣告錯誤,在main函式前新增extern int islittleendian(void);extern void tootherendian(tentry *e);
常用命令:
進入gdb除錯狀態:$gdb ns
執行指令碼:r file.tcl
設定斷點:b file.cc:行數
刪除斷點:d b 斷點編號(1,2,...)
顯示變數或函式值:display var
刪除變數或函式值顯示:d d 變數編號
單步執行:n
單步跳入:s
迴圈執行:c
列出執行棧的內容:bt——主要針對遇到segment fault的情況
退出除錯:q
main函式中只有兩句**
return 0;
這個函式可以說包裝了整個ns2框架,因為緊接著它的下一句語句就是:return 0!
然而,此時,當我們想通過f5(單步跳入)檢視tclmain函式的具體實現時,ide的終端又直接跳至提示符。也就是說,我們仍然無法檢視tcl_main函式的原型,也就無法檢視ns2框架的大部分內容。
我們能檢視到 main函式的實現卻看不到tcl_main函式的實現的原因在於: tcl_main函式所在的檔案並非位於ns2.*目錄下,而是位於另乙個目錄下(後面將看到是tcl8.4.*目錄的unix子目錄)。而且tcl_main函式是被編譯到乙個靜態鏈結庫檔案中去了(後面我們將知道是libtcl8.*.a)。 我們此時,只是在ns2.*目錄下,用./configure --enable-debug 新增了除錯資訊,但卻沒有在 tcl_main 函式所在有 tcl8.4.*目錄下 新增除錯資訊(具體來說是在tcl8.4.*的unix目錄下的makefile檔案中新增 -g選項)
為了能夠跟蹤到tcl_main函式中去,我們作如下操作:
切換到 tcl8.4.*目錄的unix子目錄,然後 我們會發現 裡面有乙個libtcl8.*.a 和另乙個libtclstub.*.a 檔案,前乙個大小為700多k(這其實是未新增除錯資訊前的大小)。 再次用make clean命令清除所有目標、庫檔案後,我們不能再次用sudo ./configure --enable-debug 命令來新增 除錯資訊(其原因在於此處的 makefile.in 檔案有些特殊)。 我們所要做的是 將 makefile檔案中的 下面內容(102-106行)
# to change the compiler switches, for example to change from optimization to
# debugging symbols, change the following line:
#cflags = $(cflags_debug)
#cflags = $(cflags_optimize)
#cflags = $(cflags_debug) $(cflags_optimize)
cflags = $(cflags_optimize) -dtcl_dbgx=$(tcl_dbgx)換成
# to change the compiler switches, for example to change from optimization to
# debugging symbols, change the following line:
#cflags = $(cflags_debug)
#cflags = $(cflags_optimize)
cflags = $(cflags_debug) $(cflags_optimize)
#cflags = $(cflags_optimize) -dtcl_dbgx=$(tcl_dbgx)
其意思是將編譯械從原來的 優化模式 切換 到 debug+ optimize模式。相當於 前面所講 的 在ccopt 後新增 -g 選項
然後 ,再次 make ,生成兩個新的.a 檔案.
注意:在unix目錄生成新的.a檔案後,須將這兩個檔案拷貝至 ns-allinone-2.3*的lib目錄下(因為,在生成ns2時,指定的libtcl8.*.a 的庫路徑為lib)
其實,我們在用make 命令生成ns時,從終端的輸出便可以知道ns引用了哪些靜態庫。為了能夠全程除錯,這些靜態庫都應該如libtcl8.*.a庫一樣,新增除錯資訊後重新編譯生成。
新增除錯資訊無非就是更改對應的makefile 中的gcc 編譯選項(不同庫的makefile不相同,有的庫用 ./configure --enable-debug命令不能新增 除錯資訊,必須手動修改makefile)
另外,還需要注意的是:ns所依賴的這些靜態庫實際上是有相互依賴關係的,因此,重新編譯它們,也需要按照一定的順序。這也是為什麼 ns的allinone包在安裝各個包時,其順序都是固定的原因。
NS2 除錯環境安裝 GDB
首先安裝gdb,這個比較容易 在 home ns allinone 2.35 ns 2.35 目錄下的makefile 檔案,找到55行附近 ccopt wall wno write strings 將這句修改為 ccopt wall wno write strings g 36行附近的兩行 cc ...
在NS2中新添協議
在ns2下進行新協議開發的一般流程 由於ns2使用 物件模型,所以在協議開發的過程中,總是從c 和tcl兩個類入手。流程說明如下 1 定義新的路由協議 在aodv.h中定義class aodv public agent 在ns2中,所有路由協議都是從agent類繼承而來的。其中,recv 函式和co...
從Linux學到NS2 (二)搭建NS2中重要元件
本篇問題 1.1 cc是linux下c 原始檔的預設字尾,cpp是c 語言檔案的字尾名,採用.cc字尾 執行 g poisson.cc o poisson.o std c 11 後生成檔案 poisson.o 其中.o是編譯的中間目標檔案,可以將多個中間目標檔案鏈結成可執行檔案。2.ns 的唯一記錄...