星期二, 10月 05, 2004

[Network] ns2 除錯

原文http://kunlung.csie.org/ns2_experience.html

☆用 gdb 來 debug

使用gdb (GNU debugger)可以對debug更有幫助,
例如難解的segmentation fault

不過ns-2.1b9目錄需要重新compile
編輯 Makefile.in
找到底下兩行

$(CPP) -c $(CFLAGS) $(INCLUDES) -o $@ $*.cc
$(CC) -c $(CFLAGS) $(INCLUDES) -o $@ $*.c

改成

$(CPP) -g3 -c $(CFLAGS) $(INCLUDES) -o $@ $*.cc
$(CC) -g3 -c $(CFLAGS) $(INCLUDES) -o $@ $*.c

執行 ./configure
./make
(因為compiler依據Makefile.in產生Makefile,
若改在Makefile則無效)
完成後,可以這樣使用(我的tcl放在 ~ns/examples )

gdb ../ns

(進入gdb畫面)

r kiwi.tcl

或是 r kiwi.tcl > log1 (r即為run)

通常程式中斷時,用backtrace 可以查呼叫關係
另外b(breakpoint)可以設中斷點



設中斷點的方法:

打 gdb ../ns 之後

進入gdb 命令提示列

打 b [路徑][檔案名]:[行號]

例如:

b mac/mac802_15_3.cc:1500
就是把中斷點設在mac802_15_3.cc的第1500行

最容易錯的地方在於路徑
gdb的current work directory 是執行檔的那個目錄
因為我們是執行ns
所以工作目錄應該是 ns-2.1b9
所以若我要debug mac目錄裡的檔案,前面就要加 "mac/"

設好中斷點後
r XXX.tcl 便開始執行
遇到中斷點就停下來
這時可以用n (代表next)一行一行的執行



配合中斷點

還可以加上條件式中斷

語法:

condition N EXPRESSION

N是中斷點的編號

EXPRESSION是一個敘述句

例如

condition 1 Scheduler::instance ().clock > 1.044412

就是說當時間超過1.044412且到達1號中斷點才中斷

gdb真的很強

EXPRESSION 怎麼寫都有效... :P



☆常見的 bug 訊息與原因

以下列出在make時常遇見的錯誤訊息的原因:
Scheduler: Event UID not valid!
這是scheduler物件的錯誤訊息
最常的可能是有一個timer物件,還沒有expire而你又呼叫它的start function
可能發生在你寫了新的timer物件,或是你更改了原作者的程式流程
中止在一點也沒有錯的程式區段
可能是你新增了新的data member在.h裡
因為交叉include而沒有被compile到
這時試試看 make clean; make
常常就OK了

Segmentation Fault
最常發生的原因是指標所指的物件不存在,或是traverse陣列時跑到陣列外面去了

沒有留言: