在NS2中用GDB來除錯

2021-05-22 09:52:12 字數 2759 閱讀 7569

我想對於用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 的唯一記錄...