程式者的胡言亂語
Debug的困境
Debug,基本上是一種不斷針對問題的真正導因提出假設,然後試著驗證假設的過程。在這個過程中,你會猜測可能的原因,然後試著從系統的行為及反應中,驗證自己的假設是否正確。在某個假設尚未被宣告不成立時,某種程度你會讓自己相信假設是對的,
我們之前被一個問題困擾了很久(起碼
眾所皆知的,Vista的UAC對安全性有極為嚴格的管制。任何一個有血性的程式員看到這種現象,都會猜想這應是Vista安全性機制所造成的,所以我們便試著朝著安全性的方向去解決。但無論怎麼調低Vista上IE的安全等級,都無法成功的載入該ActiveX,這使得我們始終停留在原地,問題也無法解決。
以上述的情況來看,我們提出了一個很合理的假設,但是在試圖去驗證它是否成立的過程中,始終無法驗證它成立,但更麻煩的是,我們也無法驗證它不成立。也因此,我們不知道究竟何時應該放棄這個假設,繼續提出下一個假設。
還記得在解決這個問題的前一天中午吃飯時,我還跟一個小妹妹說,debug就是不能有偏見、預設立場,否則一旦鎖死在一個不正確的立場上,就很難跳脫這個成見,自然就無法找到真正的問題所在。
在隔天早上,我決定全部清空重來。重新再做一個最單純的ActiveX,什麼都不做,看看在Vista上載入的行為如何。結果竟然神奇的成功載入。這意謂著,我們的ActiveX做了什麼事,使得Vista在載入時發生了問題。
我先猜想是元件相依性的問題,也許我們遇到問題的ActiveX所連結的DLL或其他COM元件被UAC阻擋了,所以一個元件一個元件的加到那個最單純的ActiveX中,結果皆能正確載入。還真是怪呀(不過不怪,也就不會卡這麼久了)。
通常,愈是邏輯上難以思索的問題,其原因愈是簡單,也愈不是你想像的那樣。經過反覆檢查,後來發現是包裝ActiveX的CAB檔中所記錄的Class ID值,和ActiveX本身的Class ID不相符。在XP上會以ActiveX的為主向OS註冊,但Vista卻是以CAB檔中的Class ID為主向OS註冊,導致載入ActiveX時找不到註冊的元件。
這是一個debug的例子。原先的假設很合理,但卻始終不能宣告這個假設是對的,或者是不對的。如果這個假設是對的,但卻中途放棄了,不僅是白費力氣,而且也錯失了正確的方向。如果這個假設是錯的,卻又持續投入心力,很有可能繼續陷於泥淖而不能脫身。這便是我所謂debug的困境。
Posted at 11:24上午 五月 04, 2008 by Chien-Hsing Wang in General | 迴響[11]
星期日 五月 04, 2008

寫的真好
我也一直被 Vista 的 UAC 弄的頭好昏 @_@
由...發表 Chui-Wen Chiu on 五月 04, 2008 at 02:41 下午 CST #
本文關鍵字: 小妹妹
(逃)
由...發表 cjin on 五月 05, 2008 at 04:13 下午 CST #
相信這是每個Programmer都曾碰到的問題:)
由...發表 GDX on 五月 05, 2008 at 04:46 下午 CST #
你好 肯請轉貼此文至
http://blue0601.spaces.live.com/
謝謝
由...發表 blue on 五月 05, 2008 at 06:29 下午 CST #
@blue
No problem. Thanks~
由...發表 Qing on 五月 05, 2008 at 10:24 下午 CST #
@cjin
我身邊一心向學的小妹妹這麼多,"小妹妹" 怎麼會是關鍵字呢? :)
由...發表 Qing on 五月 05, 2008 at 10:25 下午 CST #
補充一下觀察到的情形...
Vista裡安裝包成CAB的ActiveX時, 至少會寫CLSID到registry的兩個地方
一是 HKCR\CLSID下, 這邊仍會以OCX本身的CLSID去產生{XXXXXXXX-...}的Key,
另一個是在 HKLM\SOFTWARE\Microsoft\Code Store Database\Distribution Units下, 這邊則是以CAB裡inf所記錄的CLSID為準去產生{YYYYYYYY-...}的Key,
在IE中附加元件所列的項目, 應該是根據上述第二個registry下所記錄的CLSID來載入, 因此才會發生OCX始終載入不了的問題, 而在這種情況下, 附加元件列表中還是可以看到安裝的項目, 只是狀態會是 damaged..
由...發表 winwell on 五月 08, 2008 at 02:23 上午 CST #
你好, 我是從獨孤木那兒連過來的.
我也在學中醫, 雖然是跟不同老師學, 看法不完全相同.
看到你們的討論覺得很有趣. 其實這也是我和同學在生活中常會碰到的挑戰. 冒昧提出我的想法.
不是沒辦法說清楚 講明白, 而是整個基本概念和一般常識差異太大, 很難用幾句話/一篇文章說到對方能理解.
要了解最好的方法就是去上課, 讓明師帶領入門. 我第一次上完課,完全呆掉, 許多觀念都和常識不同, 甚至相反, 心理一直在想, 真的嗎? 真的無法完全接受! 可是幾次課下來, 慢慢在自己身上有些印證, 才慢慢接受.
不過接受後, 難題又來了, 因為自己沒有能力自己治, 遇到病痛,求醫經驗卻讓我覺得我家附近的中醫師很遜.....漸漸發現老師罵人罵得有理.
我也很納悶, 為何開業的中醫師不是每個都值得信賴. 據老師的說法, 是因為中醫教育要先上幾年的西醫, 觀念上好像變成西醫為主, 中醫為輔. 但中醫有許多觀念是和西醫相反的, 混在一起當然完蛋.
由...發表 kukumom on 五月 15, 2008 at 02:18 下午 CST #
對不起, 忘了寫重點.
結石可以用草藥 六角英 熬茶喝. 茶不要煮太淡. 結石會慢慢化/排掉. 我們班的同學自己試過, 效果不錯. 聽說一斤才 5,60元.
老師說, 有結石的人喝起來不難喝, 等到結石沒的再喝就會想吐, 很難喝.
由...發表 kukumom on 五月 15, 2008 at 02:23 下午 CST #
@kukumom
感謝 :)
由...發表 Qing on 五月 15, 2008 at 04:01 下午 CST #
呵呵
由...發表 基智網 on 五月 19, 2008 at 09:09 上午 CST #