☆用 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陣列時跑到陣列外面去了