1、學習使用Linux,先記住一個自助式命令: man
man -f [command]
man -k [command]
man X [command] (其中'X'為數字,代表man -f [command]查詢結果中,提示該command處於Mannual的第幾部分部分)
2、學習使用DOS,先記住一個自助式命令: ?
[command] /? (查詢該命令的使用方法)
3、學習使用gdb,先記住一個自助式命令: help
help [topic]
比如,你想知道如何打斷點breakpoint,就在gdb的提示符後面輸入 > help breakpoint;
還有幾個常用的命令: [s]tepinto(相當於VC裡的F11),[f]inish(相當於VC裡的stepout),
Linux下gdb調試,還可以在某一個具體的記憶體打斷點:[b]reakpoint *[addr](addr代表你的記憶體位址),這個在定位記憶體泄露或者踩記憶體(coredump)等問題時頗為有用。
4、學習設定VIM的萬能命令—— :set all
:set all 可以列出VIM中可供使用者佈建的所有選項,你在裡面找那個和你想要設定的功能相關,試著設定一下,就OK了。如果還是不起作用,在網上搜尋一下:set all中可能有效選項如何使用,在努力一把。
今天碰到一個問題,:set noshiftround,不起作用。後來發現是:set cindent在作怪。當你設定了cindent時,從其他地方copy的代碼,通過p命令粘貼到你的VIM編輯器時,會不斷的indent,搞的代碼和 樓梯似的,亂成馬列。先:set noautoindent,再:set noexpandtab,不起作用;retry,:set shiftwidth=1,起作用了,但還是樓梯狀,不過indent=1;tritry,:set noshiftround,還不如:set shiftwidth=1呢,又indent=8了。最終發現是cindent在作怪,關閉之便好,方法:set nocindent。
5.Although the present Windows Sockets specification defines the sockets abstraction for TCP/IP, any network protocol can comply with
Windows Sockets by supplying its own version of the dynamic link library (DLL) that implements Windows Sockets.
–From: Windows Sockets: Background, MSDN Library
Window的socket是一個抽象的概念,目前支援TCP/IP協議族,你可以編寫新的DLL來滿足新的網路通訊協定的需要,比如SCTP等新的通訊協議。(萬劍歸宗)
6. MIT 麻省理工學院 開放課程
http://ocw.mit.edu/OcwWeb/web/home/home/index.htm
7. Computer Organization and Architecture [Student Course]
http://www.williamstallings.com/COA6e.html
8. 學習記憶體管理,就不得不學習malloc和free,那麼你知道malloc和free是如何?的嗎?接著問自己:free函數的入參是一塊記憶體的頭指 針,free怎麼知道釋放多大的位址範圍?釋放後這些記憶體交給了誰管理?有時候明明釋放了,可是top看到的記憶體資訊還是沒有釋放?這是為什嗎?是記憶體泄 露?還是其他原因?
現在的電腦系統越來越複雜,從硬體到我們啟動並執行程式(進程),記憶體管理被分為不同的幾個層次,不同的作業系統,其設計各有特色。大致上,可以分為以下幾個層次:[硬體] –> [虛擬記憶體系統] –> [系統級的Heap管理] –> [進程級的Heap管理(libc)] –> [我們的進程malloc/free]
對於偏左的幾個層次,我們可以暫時不瞭解, 但看看 libc 中 malloc/free 的實現,還是很有意思的,不過現在的系統(硬體/作業系統)都無比複雜,直接閱讀最新的代碼,一頭紮入最複雜的邏輯中,對我們理解其基本原理,實在沒有益 處。
去繁就簡,我們看看早期 BSD 的一個實現。參看最早的一個版本 v1.1http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdlib/malloc.c
實現很漂亮,代碼很少,但可以看到一個 allocator 看得見摸得找的"高效"實現,裡面的技巧,SGI STL allocator 也在使用。
總結:學習疑難技術的方法:尋找切入點(比如這裡的free/malloc),再學習其發展曆程,最好從它最簡單最原始的階段開始抽絲剝見。(侯捷解剖MFC時使用的便是此法)
學習本質的利器:FreeBSD的早期實現版本的原始碼(學習Revision Tree中的最早版本)
–From: http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/stdlib/malloc.c
9. 編譯成功,但連結時報錯:unreferenced symbol: #####. 說明你連結時使用的靜態庫不存在,或者該靜態庫版本不正確。
診斷方法:
Windows平台: 使用dumpbin /SYMBOLS XXX.lib /OUT:XXXlibsymbol.txt,產生靜態庫的符號表,在產生的XXXlibsymbol.txt中尋找#####,如果找不到,則您需要拿到正確版本的靜態lib庫先。
Linux平台: 使用nm/objdump工具,產生靜態.a庫的符號表,其他同上。