/* 日期:2013-08-12 22:44
/**************************************
只是感興趣,沒有其他目的。失誤之處敬請諸位大俠賜教!
聽同事說win也有mount工具,好奇心驅使就搜了一下.
發現國內的著名程式設計師劉濤濤寫了一款免費的win mount工具.
甚是喜歡.圖1
只可惜我在使用的過程中,
程式會占用100%cpu:(
0x2 bug重現(如何產生).
首先弄個壓縮軟體,我當前用的是 7z 加密壓縮任意乙個檔案.(不加密檔名).
然後用mount工具雙擊開啟.這個時候就可以看到mount建立了乙個新視窗.(輸入密碼框)
此時我無意中點到父視窗,發現程父視窗也是活動視窗. (原來是非模態視窗,有點意思)圖2
知道是非模態視窗後,我就下意識的關閉了父視窗,有意思的事情發生了,cpu就跟打了雞血一樣,乙個勁猛彪~圖3
一開始我不相信自己的眼睛,我在心裡想,肯定是系統或者其他什麼軟體出了問題了.
不可能是mount自身的問題.為了搞清楚到底是什麼原因導致的cpu占用100,我決定分析它.
od載入後,自己能想到的所有斷點,都試了一遍,都沒有斷下來.
在一陣狂試都沒有斷下後,終於放棄下斷點的方法了.
找了幾首經典歌曲,邊聽邊想思路.
mount佔cpu的時候,作業系統雖然有點卡,但並沒有卡死.
說明至少不是
for(true)
while(true)
這一類的死迴圈導致的卡死.
所有自己已知的如等待類函式也都下斷點測試過了.
最後想就從執行緒下手吧.
開啟執行緒視窗,可以看到有四個執行緒在拼命工作,(為了方便檢視,我們可以點一下user time)圖4
現在終於知道了,是這四個執行緒導致的,那麼從entry處分析就行了.
最終分析得知導致卡死的是
kernel32.getqueuedcompletionstatus
這個函式.
我們來看一下函式原型和介紹.
1getqueuedcompletionstatus
2 the getqueuedcompletionstatus function attempts to dequeue an i/o completion packet from a specified i/o completion port. if there is no completion packet queued, the function waits for a pending i/o operation associated with the completion port to complete. 34
bool getqueuedcompletionstatus(
5 handle completionport, //
handle to completion port
6 lpdword lpnumberofbytes, //
bytes transferred
7 pulong_ptr lpcompletionkey, //
file completion key
buffer
9 dword dwmilliseconds //
optional timeout value
10 );
1 6b1192e0 $ 55通過幫助文件介紹我們知道 kernel32.getqueuedcompletionstatus 這個函式push
ebp2 6b1192e1 . 8bec mov
ebp, esp
3 6b1192e3 . 83ec 0c
sub esp, 0c
4 6b1192e6 . 56
push
esi5 6b1192e7 . 8b35 4870126b
mov esi, dword ptr ds:[;
kernel32.getqueuedcompletionstatus
6 6b1192ed . 8d49 00
lea ecx, dword ptr ds:
[ecx]
7 6b1192f0 > 6a ff push -1
8 6b1192f2 . 8d45 fc lea eax, dword ptr ss:[ebp-4
]9 6b1192f5 . 50
push
eax10 6b1192f6 . 8b47 08
mov eax, dword ptr ds:[edi+8
]11 6b1192f9 . 8d4d f4 lea ecx, dword ptr ss:
[ebp-c]
12 6b1192fc . 51
push
ecx13 6b1192fd . 8d55 f8 lea edx, dword ptr ss:[ebp-8
]14 6b119300 . 52
push
edx15 6b119301 . 50
push
eax16 6b119302 . ffd6 call
near esi
17 6b119304 . 8b45 fc mov eax, dword ptr ss:[ebp-4
]18 6b119307 . 85c0 test
eax, eax
19 6b119309 .^ 74 e5 je short wmcore.6b1192f0 ;
// 這裡導致死迴圈了~
20 6b11930b . 8b55 f8 mov edx, dword ptr ss:[ebp-8
]21 6b11930e . 8b40 14
mov eax, dword ptr ds:[eax+14
]22 6b119311 . e8 eaf7ffff call
wmcore.6b118b00
23 6b119316 .^ eb d8 jmp short wmcore.6b1192f0
的意思是從指定的iocp獲取cp,當cp隊列為空時.對此函式的呼叫將被阻塞.
阻塞?沒錯,阻塞就不會占用cpu100%,但是他的io控制代碼是父視窗建立的 父視窗關閉了,也把控制代碼析構了.
他的邏輯寫的是"死迴圈",所以控制代碼不存在了,就會不停的重複呼叫.也就會cpu占用100%了.
0x3 修復方案
1) 那個視窗改成模態視窗
2) 父視窗關閉時,應該先提前關閉非模態視窗.
這個應該也不能算是bug吧,只能算是我誤操作.
而且一般人應該也不會像我那樣操作.直接關閉父視窗的
--==mount英文官方==--
--==mount中文官方==--
--==mount官方招聘==--
才發現,英文版的是page是2011更新的.
中文版的page是2010更新的
訪著名Linux核心程式設計師大鷹
在網路安全界,如果說起艾奇偉,或許大家都會茫然,但是如果說不認識大鷹,那一定會有人取笑你。這個名字確實很響亮,就象鷹一樣飛遍了網路安全界。登入他的主頁www.e4gle.org,全英文版面的設計可以看出其中的技術含量。尤其是他所在的組織的wss,已經達到了世界級水平。linux界的名人在生活中是什麼...
訪著名Linux核心程式設計師大鷹
在網路安全界,如果說起艾奇偉,或許大家都會茫然,但是如果說不認識大鷹,那一定會有人取笑你。這個名字確實很響亮,就象鷹一樣飛遍了網路安全界。登入他的主頁www.e4gle.org,全英文版面的設計可以看出其中的技術含量。尤其是他所在的組織的wss,已經達到了世界級水平。linux界的名人在生活中是什麼...
程式設計師何苦為難程式設計師
職場上有很多辛酸事,很多合夥人出局的故事,很多技術骨幹被裁員的故事。說來模板都類似,曾經是名校畢業,曾經是優秀員工,曾經被領導表揚,曾經業績突出,然而突然有一天,因為種種原因,被裁員了,想申訴,想求解釋,結論是,能力不匹配,未能與企業一起成長云云。這有兩說,一說是企業冷血,卸磨殺驢,嫌棄老人成本太高...