墾丁夜間採集調查

在大家慶祝母親節的這兩天

趁著出遠門的人少

跟我女友來了趟墾丁的夜間採集

115564362-P5070287.jpg.jpg  

 

出發後沿路車真的很少

早上快六點出門,並不趕時間的照著速限順順開

半路還下去吃了碗糕蘭跟綠豆蒜

到海生館也才12:30左右

跟海生館的學長會合後

聽他說如果中餐速戰速決說不定可以跟到小鄭教練下午的潛水

趕快隨便買了便當殺去陽光潛水

 

到陽光以後果然小鄭一行人還正在準備要出發

趕忙扒完便當裝好像機就出發往合界了

遙想當年我因為是接近冬天學潛水

當時也是下墾丁來玩順便請小鄭幫我結訓考試

睽違9年終於又有機會跟他潛水了~

以前為期不長的相處就可以感覺出他是個謹慎的教練

跟他潛水格外的放心

 

下水的時間大約下午三點

下潛後就先開始向外頂流

冬天悶了這麼久的我這次一定要把握機會多拍些照片~

 

 

 

由於合界是比較容易有水流的潛點

下面不時可以看到些軟珊瑚跟海扇

115564348-P5070254.jpg.jpg

 

 

 

海百合的共生蝦基本上都是我女友找給我看的

我實在難以獨立找到這種偽裝高手

115564350-P5070265.jpg.jpg

115564352-P5070266_cr.jpg.jpg

 

 

 

遠遠的拍到一對共生的蝦虎與槍蝦

115564354-P5070270_b_cr.jpg.jpg

 

 

 

花旦石鱸的幼魚(扭扭)

扭超快的拍的時候要注意快門

115564356-P5070274_cr.jpg.jpg

 

 

 

一隻小雀鯛與他閃亮的小兄弟

115564358-P5070276_cr.jpg.jpg

 

 

 

下午的海裡就有這麼多的閒雜人等

我想晚上下水 蝦+魚+蟲 應該會讓我眼花撩亂

115564360-P5070282_cr.jpg.jpg

 

 

 

一對停留在珊瑚上方的鬼龍

因為游泳能力不強所以可以讓大家的相機都留下他們的倩影

P5070287.jpg

 

 

 

運用外閃可以把魚體的顏色及螢光色較忠實的呈現出來

也比較不受水中懸浮粒子的干擾

115564364-P5070289_cr.jpg.jpg

 

 

 

 

這邊有幾隻肥大的透紅小丑

但卻意外的膽小

115564366-P5070290_b.jpg.jpg

 

 

 

 

下午的潛水結束後便急急忙忙的回陽光準備晚上的雞絲

五點便到遊艇港與船長會合

由於到採樣的地點一個多小時的船程

正好可以給我們足夠的水面休息時間

而合界的深度較大(今天潛到約24~25M)

也正好符合潛水計畫原則"先深後淺的潛水"

可說是一切都在掌握中(唬爛)

 

 

 

半路上可以看到美麗的夕陽

115564368-P5070301.jpg.jpg

 

 

 

第一支下水後便開始到處亂拍啦

好閃亮的海蛞蝓

115564370-P5070307_cr.jpg.jpg

 

 

 

 

全身偽裝的蜘蛛蟹

115564372-P5070313.jpg.jpg

 

 

 

 

一隻躲在珊瑚後面

伸出手抓東西吃的鎧甲蝦

115564374-P5070314_cr.jpg.jpg

 

 

 

 

接下來的蝦子基本上我是不認識的

115564376-P5070320_cr.jpg.jpg

115564380-P5070322_cr.jpg.jpg

 

 

 

 

好像叫對蝦是吧

115564382-P5070323_cr.jpg.jpg

 

 

 

 

這隻鰻魚不小

一開始還好奇的一直伸出頭來

後來燈很亮才慢慢縮回去

115564384-P5070328.jpg.jpg

 

 

 

 

這隻比目魚有點可憐

體色被我們的燈打到亂變一通了

115564386-P5070331.jpg.jpg

 

 

 

 

春神來了晚上的海底一打燈果然熱鬧

燈前密密麻麻的全是小蝦,下面有原圖放大

115564388-P5070339.jpg.jpg

115564390-P5070339_cr.jpg.jpg

 

 

 

 

我想他是一個很注重平衡的寄居蟹

115564392-P5070346.jpg.jpg

 

 

 

 

特殊的蜜蜂蝦

再下一張照片可以看到他跟常見的蜜蜂蝦體色有點不一樣

(5/24 PS:後來我女友問過老師,雖然體色有所差異,不過目前分類上他們還是歸類為同一種)

115564394-P5070347_cr.jpg.jpg

115564396-P5070348_cr.jpg.jpg

 

 

 

 

這張我回來一開始還問我女朋友說是我照的蝦子跑掉了嗎

已經偽裝到在照什麼自己都看不出來了…

115564398-P5070360.jpg.jpg

 

 

 

 

色彩與紋路很漂亮的扁蟲

115564400-P5070361_cr.jpg.jpg

 

 

 

 

潛完兩支後還要整理請漁民幫我們採集的樣本

整個就是搞得很晚很累

回到陽光潛水洗完裝備看看時間都12點了

我已經19個小時沒睡了…

等吃完消夜再灌洗一下

我想隔天可以放棄額外的潛水了

反正氣象也說要起浪了(這應該是酸葡萄心理)

 

這次一切的採集行為跟以往一樣

做的都是政府的計畫並且是有採集證的

如果您是一般的遊客請注意

不可在國家公園範圍內有採集生物的行為,以免觸法

當然就算在國家公園以外也請盡量不要帶走任何的生物

只要帶走美好的回憶就可以了

 

最後下圖是隨手拍到海生館研究中心園區內圈養的馬(有時也會出來趴趴走)

聽說這些都是退役的血清馬

在對人類做出許多犧牲之後

我們僅能給予他們的

是美麗的環境及無憂無慮的生活

讓他們在墾丁的艷陽下,湛藍的大海旁,不甚肥沃的草地上安享晚年

恩…其實我想說的是….他馬的!真爽!

115564402-P5080387_c.jpg.jpg  

windbg aspnet_wp(2)

繼續上次debug的階段

當我們把.NET在作什麼事情丟出來以後

如果要更深入的看裡面的變數也是可以的比方說我要在當下的 thread 裡看詳細是作了哪些事 (Dump Stack Objects)

0:054>!dso

OS Thread Id: 0xaf0 (54)
ESP/REG  Object   Name
15b3e4a8 05ba96a0 Microsoft.Win32.SafeHandles.SafeWaitHandle
15b3e4d0 05b0f710 System.AsyncCallback
15b3e564 01f9befc System.Object[]    (System.Object[])
15b3e570 01f9bf88 System.String    D:xxxCacheAdPV671671_2010101416.txt
15b3e574 01f9beb8 System.String    D:xxxCacheAdPV671
15b3e578 05b78060 System.String    1
15b3e60c 05b0f710 System.AsyncCallback
15b3e620 01f9bf50 System.String    671_2010101416.txt
15b3e634 01b0af64 System.String    D:xxxCacheAdPV
15b3e650 05bab274 System.String    Start
15b3e664 05af01d0 System.String    
15b3e688 01b0af64 System.String    D:xxxCacheAdPV
15b3e68c 01b0b320 System.Configuration.KeyValueInternalCollection
15b3e698 05b10220 System.Text.UTF8Encoding
15b3e6bc 01b09724 System.String    3
15b3e6c0 01b0b320 System.Configuration.KeyValueInternalCollection
15b3e6d0 05b10220 System.Text.UTF8Encoding
15b3e6dc 01f9a708 System.Object[]    (xxx.Data.Advertisement[])

………………………………..

 

 

中間 Object 下 8位 16 進制的就是記憶體位址

表示在這個位址裡面放了右邊所執行的命令

針對有些像是陣列或是object, 我們可以繼續下指令去dump看裡面到底包了什麼

共有以下三種指令 da dd do

說實在我並不清楚這三種的差別是什麼, 但最顯而易見的就是下對指令才dump的出來

0:054> !do 01f9a708
Name: System.Object[]
MethodTable: 793042f4
EEClass: 790eda64
Size: 28(0x1c) bytes
Array: Rank 1, Number of elements 3, Type CLASS
Element Type: xxx.Data.Advertisement
Fields:
None
0:054> !da 01f9a708
Name: xxx.Data.Advertisement[]
MethodTable: 793042f4
EEClass: 790eda64
Size: 28(0x1c) bytes
Array: Rank 1, Number of elements 3, Type CLASS
Element Methodtable: 0f867160
[0] 01f998f8
[1] 01f9a6ac
[2] 01f9a650

 

 

 

上面可以看到do拿他沒皮條時我換用da來下, 接著又出現三個address

繼續下指令去扒

0:054> !do 01f998f8
Name: Pushba.Data.Advertisement
MethodTable: 0f867160
EEClass: 0f945078
Size: 92(0x5c) bytes
 (C:WINDOWSMicrosoft.NETFrameworkv2.0.50727Temporary ASP.NET Filesroot141ebe66ccec38aeassemblydl3102e98b9ac990b34_d244cb01xxx.Data.DLL)
Fields:
      MT           Field       Offset            Type         VT     Attr       Value Name
79332d70  4000044       14         System.Int32  1 instance      671 id
79332d70  4000045       18         System.Int32  1 instance        3 venderID
79330b24  4000046        4        System.String  0 instance 01f9983c authKey
79330b24  4000047        8        System.String  0 instance 05af01d0 imageUrl
79330b24  4000048        c        System.String  0 instance 01f9985c navigateUrl
79330b24  4000049       10        System.String  0 instance 01f998c4 alternateText
79332d70  400004a       1c         System.Int32  1 instance        0 impressions
79332d70  400004b       20         System.Int32  1 instance    21907 viewed
79332d70  400004c       24         System.Int32  1 instance        5 clicked
7932a368  400004d       28        System.Single  1 instance 0.010000 valuePerView
7932a368  400004e       2c        System.Single  1 instance 0.000000 valuePerClick
79332d70  400004f       30         System.Int32  1 instance    30000 viewQuota
79332d70  4000050       34         System.Int32  1 instance  1000000 clickQuota
793045f0  4000051       3c       System.Boolean  1 instance        1 enabled
00000000  4000052       40                       1 instance 01f99938 startDate
00000000  4000053       4c                       1 instance 01f99944 endDate
79332d70  4000054       38         System.Int32  1 instance        0 orderID

 

 

因為直接貼文字的關係對齊有點亂掉

不過還是可以看出來在這段記憶體裡面擺了什麼東西

欄位從4000044開始, offset為記憶體的偏移植

比較重要的是你可以根據Name跟 Value來檢查到底發生問題時有沒有什麼值出錯了

 

其實在debug的階段經驗是很重要的

因為我們不可能把這麼多的thread一一分析

有經驗的工程師可以依照其經驗來判斷哪裡可能有問題並快速的驗證

由於我很菜, 這個bug還真花了我不少時間

因此分享一下解決的過程, 希望遇到類似困難的人看到這篇可以減少摸索的時間

 

首先既然我們不可能去分析所有的thread, 那麼就先來猜出可能搞鬼的是誰

由於每次發生deadlock時總是在線程數60以上

因此我們可以合理的懷疑某個thread死占著資源不放

而這支程式又常常被呼叫到, 導致後面大排長龍

先做一個表格來統計到底發生deadlock時, 到底這60多條thread在幹嘛…

 

在整理好之後我發現我應該抓出兇手了

程式再讀寫快取的thread竟然占了40條

顯然是因為快取檔案資源占用造成後面陸續要讀寫快取的線程塞爆了

這邊可以對照剛剛dump出來的資訊

0:054> !dso
OS Thread Id: 0xaf0 (54)
ESP/REG  Object   Name
15b3e4a8 05ba96a0 Microsoft.Win32.SafeHandles.SafeWaitHandle
15b3e4d0 05b0f710 System.AsyncCallback
15b3e564 01f9befc System.Object[]    (System.Object[])
15b3e570 01f9bf88 System.String    D:xxxCacheAdPV671671_2010101416.txt
15b3e574 01f9beb8 System.String    D:xxxCacheAdPV671
15b3e578 05b78060 System.String    1
15b3e60c 05b0f710 System.AsyncCallback

 

有好幾個thread都在吃這支D:xxxCacheAdPV671671_2010101416.txt

然後就在那邊癡癡的等 (System.AsyncCallback)

難怪造成服務的deadlock

 

幸好在花了這麼多時間後把問題給解了

沒想到網站上遇到的問題也可以memory dump

在debug上來講真的是很有威力

不過整個過程真是有點辛苦, 拜託網站不要再出包了…

 

大部分的指令參考自 http://www.cnblogs.com/juqiang/category/261813.html

裡面還有很多更進階的指令介紹喔

windbg aspnet_wp(1)

今天研究了一下用 windbg 來 trace aspnet_wp crash 的狀況

沒想到離開 NB ODM 之後還會用到這個 debug tool

因為整個過程真是有點複雜所以也順便紀錄一下

首先要先去下載微軟的windbg tool

他裡面有一個可以dump的小工具ADPlus

C:Program FilesDebugging Tools for Windows (x86)ADPlus.exe

直接打 adplus 就會有操作說明

我是在系統 hang 時 dump 出 aspnet_wp 這個程序的 dump file

adplus -hang -pn aspnet_wp.exe -o D:dump

再來先開啟 Windbg 並載入 dump file

這時候可能會出現跟我一樣的警告 找不到 Symbol file

112067933-20101016_01.jpg.jpg

 

 

請在 FileSymbol File Path 裡面輸入路徑如圖示

路徑可以隨便擺 後面MS的路徑是讓你可以直接下載Symbol回來用的

 112067934-20101016_02.jpg.jpg

 

 

 

再來下指令0:000>~

這個指令會把你 dump 時所有的 thread 丟出來

以我的 dump file 來看當時有 62個 thread 在執行

可以用~*s 來切換到你要 trace 的 thread  *=0,1,2….,62

112067935-20101016_03.jpg.jpg

 

 

切過去以後可以下 0:000>kbn 來看這個 thread 在做什麼

根據網路上的資料 由於執行時是以 stack 的方式來作

所以在看的時候要由下往上看 也就是以記憶體大的位址開始看起

 112067936-20101016_04.jpg.jpg

 

 

不過這在寫什麼鬼是看不懂的 這時候我們可以選擇 call out 求救…..

load 進 sos.dll 的指令下法有好多種 不過我還是直接指定路徑

0:002>.load C:WindowsMicrosoft.NETFrameworkv2.0.50727sos.dll

這時如果有出現 80004005 的錯誤訊息請參考 之前這篇

 現在就可以下指令來看到底 .net 在作什麼了

0:002>!clrstack

如此就能看出來 hang 住的時候你的系統到底在做什麼了

112067937-20101016_05.jpg.jpg

 

 

如果你跟我一樣不幸的擁有很多的 thread 可以用這個指令

0:002>!~*e!clrstack 

這又可以一次把所有的 thread 都丟出來


可惜以前在debug ACPI 的時候忙到快爆了沒有順便寫一篇

可以中斷電腦的執行並 trace ACPI code 真的也是非常有趣的事情

要感謝以前在英業達的前輩 Kuo

要不是他花了很多時間教我這些 debug 的方法

我也不可能在接觸.net 不到兩個月的時間能夠堪稱"會用" windbg 來 trace aspnet_wp hang

希望正在上海出差的他可以顧好他的肝

windbg Failed to load data access DLL, 0x80004005

今天在用windbg的時候遇到一個問題

load完dll檔之後要下指令給他跑時出現這樣的錯誤訊息

仔細看一下發現原因出在load進來的dll版本

我的版本是4927而Server的版本是3615

這時直接把Server上的檔案copy回來在安全模式下覆蓋就可以了

 

PS:記得要先備份原始檔否則以後有要在本機上跑時會有問題

 

CLRDLL: C:WINDOWSMicrosoft.NETFrameworkv2.0.50727mscordacwks.dll:2.0.50727.4927 f:0
doesn’t match desired version 2.0.50727.3615 f:0
SYMSRV:  D:sos.dllmscordacwks_x86_x86_2.0.50727.3615.dll4BE902C7590000mscordacwks_x86_x86_2.0.50727.3615.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/mscordacwks_x86_x86_2.0.50727.3615.dll/4BE902C7590000/mscordacwks_x86_x86_2.0.50727.3615.dll not found
SYMSRV:  C:Program FilesDebugging Tools for Windows (x86)symmscordacwks_x86_x86_2.0.50727.3615.dll4BE902C7590000mscordacwks_x86_x86_2.0.50727.3615.dll not found
SYMSRV:  http://msdl.microsoft.com/download/symbols/mscordacwks_x86_x86_2.0.50727.3615.dll/4BE902C7590000/mscordacwks_x86_x86_2.0.50727.3615.dll not found
CLRDLL: Unable to find mscordacwks_x86_x86_2.0.50727.3615.dll by mscorwks search
CLRDLL: Unable to find ‘mscordacwks_x86_x86_2.0.50727.3615.dll’ on the path
SYMSRV:  Can’t create D:sos.dllmscorwks.dll4BE902C7590000mscorwks.dll
         系統找不到指定的檔案。
DBGHELP: C:Program FilesDebugging Tools for Windows (x86)symmscorwks.dll4BE902C7590000mscorwks.dll – OK
CLRDLL: Unable to get version info for ‘C:Program FilesDebugging Tools for Windows (x86)symmscorwks.dll4BE902C7590000mscordacwks_x86_x86_2.0.50727.3615.dll’, Win32 error 0n87
CLRDLL: ERROR: Unable to load DLL mscordacwks_x86_x86_2.0.50727.3615.dll, Win32 error 0n87
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
            2) the file mscordacwks.dll that matches your version of mscorwks.dll is
                in the version directory
            3) or, if you are debugging a dump file, verify that the file
                mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.
            4) you are debugging on the same architecture as the dump file.
                For example, an IA64 dump file must be debugged on an IA64
                machine.

You can also run the debugger command .cordll to control the debugger’s
load of mscordacwks.dll.  .cordll -ve -u -l will do a verbose reload.
If that succeeds, the SOS command should work on retry.

If you are debugging a minidump, you need to make sure that your executable
path is pointing to mscorwks.dll as well.

C# 中對於字串全形 半形 的判斷

今天遇到一個問題事關於字串長度的判斷

如果我們使用 字串.Length 來抓取長度的話

他會把全形的中文字也算成1個字元

這樣如果遇到中英混和的情況就很難搞了

這時可以利用System.Text.Encoding.Default.GetBytes() 的方法來抓取編碼Byte數

一般英數為ASCII code = 1 Byte

中文字型為Unicode = 2 Bytes

這樣就能準確的算出字串長度

 

範例如下

string a = “我有3隻小毛驢";

System.Text.Encoding.Default.GetBytes(a).Length

 

長度 = 6*2 + 1 = 13

grideview 列高的設定

改程式的時候遇到一個問題

預設好的gridview如果整列裡面都沒放東西高度會動態縮小

就算是塞空格進去也沒有用也就是以下這個情形

20101013_1.jpg

 

 

這時只要去預設列高就可以了

只要在其中一列設定其他列就都會影響到

我是直接修改我grideview的第一個元素

<asp:HyperLinkField DataTextField="Column0″  Target="_self"
                ShowHeader="False" NavigateUrl="~/LotteryChNumber.aspx" ItemStyle-Height="20″ >

修改後如下

20101013_2.jpg

清除並釋放MSSQL log檔

MSSQL的log檔如果沒有定期清除並釋放的話

不但log檔本身會長得很肥大

萬一需要trace時也會因為檔案太大而效率不佳最近因為某些原因要trace公司資料庫的log檔

沒想到檔案已經長到超過50G了

根本連解都解不出來

分享一下清除log檔並且釋放空間的語法

 

Backup Log DB_Name with TRUNCATE_ONLY                    //不指定備份裝置所以清空
dbcc shrinkfile (DB_Name_log , truncateonly)                     
//沒有用的空間釋放出來,truncateonly可以改成要留下的log檔大小(MB)

 

有空再來研究如何定期去清…

Windows 2003 server 防火牆問題

今天差點被擊沉了

想架設一個 2003 server 的環境來debug沒想到這麼麻煩裝好IIS之後機器可以連上外網

但是跟區網內的其他機器卻沒辦法互ping

懷疑是跟防火牆有關

但是打開防火祥出現 “由於另一個程序或正在運行的服務可能正在使用網絡地址轉換組件(ipnat.sys)" 的警告

胡搞了一陣子又上網找了一下

原來這是因為 routing service 被打開

關掉就有解了

 

先到電腦管理下把"路由及遠端存取"關掉

112012985-20101010_01.bmp.jpg

 

再去服務裡面把ICS打開(靠….圖超胡但是我懶得重抓了)

112012986-20101010_02.bmp.jpg

 

之後就能開啟防火牆了…然後就ping的到了…