2009年10月23日 星期五

Detect memory leak

WinDbg裡有個小tool - umdh - 可以幫忙檢查有沒有memory leak.
1. 先用gflags對你的軟體做設定,我們以記事本為例
gflags /i notepad.exe +ust

2. 把你的軟體跑起來,先對他做一個heap dump
umdh -pn:notepad.exe -f:first.txt

3. 讓你的程跑一段時間,再做第二個heap dump
umdh -pn:notepad.exe -f:second.txt

4. 接下來我們就可以看這兩個時間點中間有沒有memory leak
在下command之前,要先設定你的環境變數讓他能找到你的程式跟windows dll的symbol
set _NT_SYMBOL_PATH=C:\mysymbols;SRV*c:\symbols*http://msdl.microsoft.com/download/symbols

接下來就可以下command 去產生diff 檔
umdh first.txt second.txt -f:diff.txt

5. 最後就是從diff檔來檢查有沒有memory leak
檔案裡會有許多的區塊
+ 8c ( 8c - 0) 1 allocs BackTrace3202E24
+ 1 ( 1 - 0) BackTrace3202E24 allocations

ntdll!RtlReAllocateHeap+000001DE
vfbasics!AVrfpRtlReAllocateHeap+000001A0
COMCTL32!EditML_InsertchLine+00000061
COMCTL32!EditML_BuildchLines+00000435
COMCTL32!EditML_InsertText+0000017A
COMCTL32!EditML_Char+000001B5
COMCTL32!EditML_WndProc+0000045C
COMCTL32!Edit_WndProc+00000BDB
USER32!InternalCallWinProc+00000028
USER32!UserCallWinProcCheckWow+00000150
USER32!DispatchMessageWorker+00000306
USER32!DispatchMessageW+0000000F
notepad!WinMain+000000DC
notepad!WinMainCRTStartup+00000174
kernel32!BaseProcessStart+00000023


前面是memory增長的狀況,當量一直增加,就有可能是memory leak
增加/減少的Bytes量 (新Bytes - 舊Bytes)
增加/減少allocate的次數 (新次數 - 舊次數)

後面是memory被allocate時的call stack,如果猜測是memory leak
我們就可以查看這些function是不是忘記free某些resource所造成的

註:使用gflags後你的程式會跑的比平常慢,有些測試可能無法進行
測試完後記得把gflags關掉
gflags /i notepad.exe -ust

2009年4月12日 星期日

Source Server

在前面我們有了symbol server,在debug時可以自動把symbol從server上捉下來,但是沒有source code我們只能看到call stack,如果我們也想要讓source code都自動的捉下來,我們可以在把pdb放在server上之前做source indexing,source code可以放在原來的version control system上或是HTTP server上,加上適當的設定,source code就會被自動捉下來。

我們以perforce為例子來做source indexing
1. 安裝Debugging Tools for Windows

2. 設定環境變數P4CLIENT為你的workspace,以本例來說是client_localhost_1666
執行p4 info,確定"Client name"是你的workspace,而且"Server address"是指到正確的perfroce server,以本例來說,是指定到"localhost:1666"

3. 打開srcsrv.ini檔案(C:\Program Files\Debugging Tools for Windows\srcsrv),把變數MYSERVER指定為"localhost:1666"

4. 登入perforce取得token

5. 執行ssindex.cmd來做source indexing,index資料會放在pdb檔的srcsrv區塊
ssindex.com -system=p4 -source=d:\samplecode\src -symbols=d:\samplecode\src\release

-system是設定source indexing為perforce
-source是指定你source code所放的位置
-symbols是指定pdb檔所在的位置

6. 執行pdbstr來檢查結果
pdbstr.exe -r -p:d:\samplecode\src\release\sampleexe.pdb -s:srcsrv

7. 把做好的pdb檔放到symbol server上

接下來我們要如何使用?
1. copy srcsrv.ini到windbg的folder
2. 確定MYSERVER指定到localhost:1666
3. 在[trusted commands]中加上
p4.exe=C:\Program Files\Perforce\p4.exe
4. 執行windbg,設定好symbol server,當你在debug時,windbg就會幫你把source code從perforce捉下來,放在他的src folder

HTTP source server
我們也可以把source code 放在HTTP server上面,把HTTP server當做source server
1. 在做完source indexing之後,把source code extract 出來
walk.cmd d:\SampleCode\src\release\*.pdb srctool -x
extract出來的source code會放在MYSERVER的folder裡

2. 把MYSERVER整個folder放到HTTP server上,本例是放在http://localhost/source/目錄之下

3. 設定windbg有兩種方法
3.1 設定source file path 為srv*
然後修改windbg的srcsrv.ini,增加三個變數在[variables] section裡
SRCSRVCMD=
MY_SOURCE_ROOT=http://localhost/source
SRCSRVTRG=%my_source_root%\%var2%\%var3%\%var4%\%fnfile%(%var1%)
3.2 直接設定source file path 為srv*http://localhost/source;

4. 再用windbg來debug,這時他就會從HTTP server上面捉下對應的source code

2009年4月10日 星期五

財務自由

財務的三個階段
  • 財務保障
  • 財務安全
  • 財務自由
為什麼我們要達到財務自由呢?
是為了不要再為了錢而工作,而是要錢為你工作,這時就可以真的做自己有興趣的事

要如何衡量我們現在是在那個階段呢?
1. 財務保障-每月花費 x 6
達到這個階段是為了讓我們不會因為一時的失去工作而讓生活變得困難
這筆錢是不能輕易被動用的

2. 財務安全-每月花費 x 150
以這筆錢為基楚拿去投資,以複利的效果就拿到的報酬就可以支付你的花費,這時就可以不用再為工作而煩惱了
簡單的試算,每月花費3萬,本金450萬(3萬 x 150),以五年為單位,年報酬 7%
五年後投資的錢會變成 450萬 * (1 + 0.07) ^5 = 631萬
報酬為 631萬 - 450萬 = 181萬,是可以支付下一個五年的花費(3萬 * 12月 * 5年 = 180萬)

3. 財務自由-每月花費 x 150 + 夢想的花費
在這個階段你的財務狀況可以讓你不用工作而且能達到你所要的夢想
每個人的夢想有多大都不一樣,例如有人想要買一間透天別墅,
有人想要出國遊玩,當然所需的金額也不會相同。

2009年3月7日 星期六

Coverage Build

Download from here,須要有License key
在產生coverage file時有兩個比較重要的環境變數,PATH和COVFILE
PATH裡要設定Bullseye執行檔的目錄
COVFILE則是指定coverage file所要產生的位置
設定好後,利用cov01來開關Bullseye
cov01 -1是打開
cov01 -0是關掉

底下是兩個例子
在linux裡
buildcoverage.sh
export PATH=/usr/local/BullseyeCoverage/bin:$PATH
export COVFILE=$HOME/test.cov
cov01 -1
make -f Makefile.in
cov01 -0

在Windows裡
buildcoverage.bat
set PATH=%PROGRAMFILES%\BullseyeCoverage\bin;%PATH%
set COVFILE=%USERPROFILE%\My Documents\test.cov
cov01 -1
devenv /rebuild "Release|Win32" BuildAll.sln
cov01 -0

到這裡我們就有可以跑coverage的binary,就可以用這個版本來跑我們的測試
我們可以把binary和coverage file拿到其他的機器測試
注意:在跑測試時還是要有COVFILE的環境變數,指定到coverage file所放的位置,這樣測試的結果才會寫回去
要看測試結果的話,就利用CoverageBrowser來打開跑完測試的coverage file

Symbol Server

1. 安裝Apache

2. 打開httpd.conf做一些設定
設定DocumentRoot
DocumentRoot "d:/Apache2.2/htdocs"
設定Directory 權限
<directory "d:/Apache2.2/htdocs">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</directory>
然後在DocumentRoot裡建一個子資料夾Symbol

3. 安裝Debugging Tools for Windows

4.使用symstore
利用Debugging Tools for Windows裡的symstore,把Project的debug symbol存在symbol server

symstore add /r /f d:\samplecode\release\*.pdb /s D:\Apache2.2\htdocs\symbol /t "SampleProject" /v "1.0.1001" /c "Sample add"

OK,到現在,我們有一台HTTP 的symbol server,裡面有我們的debug symbol,接下來當我們要Debug時,只要指定這台symbol server就可以了。

設定WinDbg的symbol server


srv*c:\websymbol*http://192.168.0.4/symbol

第一個星號之後是指定下載下來的symbol要放在那裡,第二個星號是指定我們的symbol server

2009年3月3日 星期二

六個存錢桶

這是在”錢人想的和你不一樣”裡的一個章節,裡面說明有錢人是比較善長管理他們的金錢。

當你有一筆收入時(稅後),請依比例存入不同用途的存錢桶。

  • 10% - 財務自由帳戶 (Financial Freedom Account)
這個帳戶只能用來投資及創造被動收入,直到退休後你才能動用這個帳戶,但是不能動用到本金
  • 10% - 玩樂帳戶 (Play Account)
這個帳戶和上一個完全相反,你每個月必須要把這裡的錢花光,拿這筆錢來做一些平常不會做的事,讓你覺得自己是個有錢人。
  • 10% - 長期儲蓄帳戶 (Long-Term Savings for Spending Account)
拿來支付你想要買且金額較大的東西。
  • 10% - 教育帳戶 (Education Account)
拿來幫助自己學習。
  • 50% - 需求帳戶 (Necessities Account)
用來支付基本的日常開銷。
  • 10% - 付出帳戶 (Give Account)
用來回饋社會,幫助其他需要幫助的人。

以上的分配比例也不一定是絶對的,但是提供了一個概念。
當你開始管理你的金錢時,你的注意力就會放在財務自由上。當你有所專注,就會產生結果。

2009年2月19日 星期四

NETGEAR DG834G

很神奇的ADSL modem/router, 有很多小祕招

底下的CGI可以切換Modem only 或是 Modem + Router

http://192.168.0.1/setup.cgi?next_file=mode.htm

還可以用telnet 連進去Router

http://192.168.0.1/setup.cgi?todo=debug

要關掉的話就是把utelnetd殺掉

在telnet 連線中打 "killall utelnetd"

不過把機器設成Modem only, DHCP server不會跑起來

可以進去router 打"/usr/sbin/udhcpd /etc/udhcpd.conf"