昨晚用了最初階的GDB指令,n (NEXT 下一步) ,s(STEP 進入函式),p (PRINT 把想要的變數,把執行階段呈現出來)。其中 p的變數值呈現,和現像中差很多。
尤其是接/發訊息內容的兩個buffer(cheetah.c 裏的inbuffer 和 outb),
我們想要看它和RFC 2616 的SPEC比比看,在gdb 模式下,預設的PRINT功能,似乎不盡理想。當然這種眾人的集體創造,這種需求,想也知道,別人在多年前應該也發生過了。
google gdb print format , 發現可以用C語言的方式來秀
http://www.cmlab.csie.ntu.edu.tw/~daniel/linux/gdb.html
提到
printf expression --使用 C 語言的格式化字串 (printf format string) 功能來顯示。e.g. printf "var=%d\n", var
printf 的用法蠻五花八門,原來gdb也可以用,真是摸蛤仔兼洗褲,在
gdb可以練習。
在這裏
http://sourceware.org/gdb/onlinedocs/gdb/Print-Settings.html
提到,
set print pretty on
Cause gdb to print structures in an indented format with one member per line, like this:
$1 = {
next = 0x0,
flags = {
sweet = 1,
sour = 1
},
meat = 0x54 "Pork"
}
比較漂亮的呈現結構(structure)。
set print array on
set print array-indexes on
也可以把陣列印漂亮一點。
在強大的IDE 整合除錯環境裏,變號呈現大多很親合,很少讓我們特別考慮到這問題,因為昨晚 port 8000 被佔,導致程式沒法在emacs裏GDB, 在shell裏下,突顯了列印執行時期變數值的問題。
在往後的trace中,這些是有用的小方法。
剛好邦友weithenn 分享RHCE的主題,也會分享到,看行程(process)的指令,
看port被佔用的情況的指令,真有書到用時方恨少,花了一些時間排除異常。
昨天在emacs意外發現到,要跳出gdb模式,要用signal 裏的kill,signal在
網路程式或所謂系統程式裏,也用到很多。在獵豹cheetah1.8中,
if(signal(SIGCHLD, SIG_IGN) == SIG_ERR) {
crit("Couldn't initialize signal handlers.");
}
對於網路程式,這些系統管理概念,感覺比學習程式語言還難懂,
有些是用槍時間,或是為何而戰,因何而戰有重要的關係,
API通常和框架設計理念有相關,
這類的開發人員,如果要正確無誤的開發,除了看得懂RFC 的SPEC,實作時,一些學生時代的作業系統架構常識也不能缺少。
晚點再分享關於CGI的實作。