青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

今天遇到一個(gè)比較有意思的bug, 這里簡(jiǎn)單記錄下。

Bug的癥狀是通過拖拉邊框把我們客戶端主窗口拖小之后,再最大化,會(huì)發(fā)現(xiàn)窗口顯示有問題, 看起來像是刷新問題, 有些地方顯示的不對(duì)了。
這里要說明的是我這里的主窗口是非常復(fù)雜的窗口, 里面集成了很多組件(cpmponent),有很多層的子窗口。 這個(gè)問題只有在特定條件下才會(huì)發(fā)生, 正常情況下都是好的。

遇到這種問題,我們?cè)趺刺幚恚?nbsp;

首先當(dāng)然是觀察癥狀, 究竟是刷新問題, 還是Layout出錯(cuò)了。
我們可以通過Spy++查看窗口層次是不是正確, 窗口位置是不是對(duì)的。
查看結(jié)果是窗口的層次和Layout位置都沒有問題。

既然我們這里遇到的刷新問題,所以我們要從WM_PAINT消息著手, 我們通過Spy++查看相關(guān)窗口的WM_PAINT是不是正確。
很快我們就會(huì)發(fā)現(xiàn)某個(gè)窗口正在不停地收到WM_PAINT消息, 很可能與我們的bug有關(guān)。

一個(gè)窗口不停的收到WM_PAINT重畫, 無非大概有幾類原因:
正常情況是我們正在做動(dòng)畫, 可能是通過定時(shí)器之類的東西讓窗口不停地InvalidateRect重畫某塊區(qū)域, 我們的窗口明顯不屬于這種情況。
異常情況有時(shí)是WM_PAINT消息里我們的消息處理函數(shù)在某些條件下直接返回了,從而沒有調(diào)用BeginPaint告訴窗口無效區(qū)域已經(jīng)有效, 這樣會(huì)因?yàn)橐驗(yàn)榇翱谝恢庇袩o效區(qū)域存在,導(dǎo)致窗口一直收到WM_PAINT消息。
還有一種異常情況情況是我們是在WM_PAINT消息里調(diào)用BeginPaint后又調(diào)用了InvalidateRect, 這樣會(huì)導(dǎo)致窗口后面會(huì)再次收到WM_PAINT消息, 最后窗口陷入WM_PAINT的死循環(huán)。 

那么我們這里的問題窗口屬于哪類? 用什么方法可以判斷出來?

注意到這里關(guān)鍵的三個(gè)API:BeginPaint, EndPaint, InvalidateRect的第一個(gè)參數(shù)都是窗口句柄, 我們可以通過WinDbg的API斷點(diǎn)來跟蹤執(zhí)行過程, Attach WinDbg到我們的主窗口進(jìn)程,比如我們的窗口句柄是0x209A0, 我們可以這樣設(shè)置API斷點(diǎn):
bp USER32!NtUserInvalidateRect ".if(dwo(@esp+0x4)==0x209A0) {kv;gc} .else {gc}"
bp USER32!NtUserBeginPaint ".if(dwo(@esp+0x4)==0x209A0) {kv;gc} .else {gc}"
bp USER32!NtUserEndPaint ".if(dwo(@esp+0x4)==0x209A0) {kv;gc} .else {gc}"
上面的條件斷點(diǎn)表示,當(dāng)調(diào)用我們的對(duì)應(yīng)的API,并且第一個(gè)參數(shù)(窗口句柄)是我們的目標(biāo)窗口時(shí),打印堆棧。

很快我定位出Bug發(fā)生的原因了, 條件斷點(diǎn)顯示了API如下的調(diào)用次序:
BeginPaint->InvalidateRect->InvalidateRect->EndPaint
找到Bug的原因后,然后把Bug assign給該模塊的負(fù)責(zé)人。 (看我夠意思吧,不僅找到原因,還把調(diào)用棧都提供了)

另外 ,后面還發(fā)現(xiàn)這個(gè)bug發(fā)生時(shí)窗口的某些行為會(huì)不對(duì), 測(cè)試發(fā)現(xiàn)原因是所有窗口的定時(shí)器都不能正常工作了。
關(guān)于這個(gè)問題, 你能想到原因嗎? 

如果想不到, 請(qǐng)把我的這篇博客《從點(diǎn)擊Button到彈出一個(gè)MessageBox, 背后發(fā)生了什么》看一遍。
如果看了還想不到, 重點(diǎn)看第4條。

最后, 簡(jiǎn)單總結(jié)下:計(jì)算機(jī)的好處是它永遠(yuǎn)不會(huì)欺騙你, 它只會(huì)按部就班的執(zhí)行, 所以很多看似奇怪(甚至看似不可思議的問題), 只要你理解了程序背后的機(jī)制原理,都是可以找出根本原因的。
posted on 2014-05-30 23:18 Richard Wei 閱讀(2707) 評(píng)論(2)  編輯 收藏 引用 所屬分類: windbg

FeedBack:
# re: 記一個(gè)界面刷新相關(guān)的Bug
2014-06-04 09:59 | friv 3
我將收藏此頁,并與他的幾個(gè)朋友一起分享,希望他們能有所幫助。感謝分享。
http://www.friv3go.com  回復(fù)  更多評(píng)論
  
# re: 記一個(gè)界面刷新相關(guān)的Bug
2014-06-22 20:52 | 旗袍女裝
所以很多看似奇怪(甚至看似不可思議的問題), 只要你理解了程序背后的機(jī)制原理,都是可以找出根本原因的。旗袍女裝www.ssnz88.net  回復(fù)  更多評(píng)論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品mm| 欧美色综合网| 国产精品久久一区主播| 久久精品国产99国产精品| 亚洲欧美久久久久一区二区三区| 亚洲国产欧美一区二区三区同亚洲 | 亚洲精品久久久久久久久久久久| 狠狠色综合网| 亚洲国产激情| 亚洲免费福利视频| 亚洲综合精品四区| 久久久久久亚洲精品不卡4k岛国| 久久久亚洲影院你懂的| 免费在线看一区| 亚洲精品久久在线| 亚洲天堂av在线免费观看| 亚洲视频www| 久久久久国产精品人| 欧美不卡三区| 国产欧美大片| 欧美一区二区三区免费在线看| 欧美一区日本一区韩国一区| 欧美一区二视频在线免费观看| 久久精品成人| 欧美日韩国产综合视频在线观看中文 | 亚洲黄一区二区三区| 日韩网站在线观看| 午夜精品久久久久久久男人的天堂| 久久久久久黄| 欧美性色aⅴ视频一区日韩精品| 国内精品久久久久影院薰衣草| 日韩亚洲在线| 久久深夜福利| 亚洲一区二区三区中文字幕在线 | 欧美mv日韩mv国产网站| 在线视频一区观看| 午夜精品福利视频| 亚洲麻豆一区| 欧美一区激情视频在线观看| 欧美激情亚洲一区| 亚洲欧美另类在线| 欧美精品一区二区三区视频| 国产亚洲福利| 亚洲综合精品| 亚洲精品亚洲人成人网| 老司机aⅴ在线精品导航| 国产精品美女| 亚洲手机成人高清视频| 亚洲承认在线| 性欧美18~19sex高清播放| 欧美日韩免费高清一区色橹橹| 亚洲国产欧美日韩精品| 久久久久久久999精品视频| 在线视频你懂得一区| 欧美经典一区二区三区| 亚洲人成久久| 欧美高清在线观看| 久久婷婷色综合| 樱花yy私人影院亚洲| 久久九九久久九九| 欧美专区日韩视频| 国内精品久久久久伊人av| 久久精品国产清高在天天线| 亚洲在线观看视频网站| 国产精品亚洲综合| 久久av资源网站| 香蕉成人伊视频在线观看| 国产欧美一区二区精品性 | 欧美在线free| 亚洲视频一区| 国产精品久久久久高潮| 亚洲伊人久久综合| 亚洲美女福利视频网站| 欧美日韩一区二区视频在线 | 久久人人爽人人爽爽久久| 国产日韩视频一区二区三区| 久久精品国产清自在天天线| 久久狠狠亚洲综合| 亚洲大胆av| 亚洲人成欧美中文字幕| 欧美日韩一级大片网址| 午夜精品在线观看| 久久精品91久久久久久再现| 亚洲大片免费看| 亚洲欧洲久久| 国产精品黄页免费高清在线观看| 亚洲一区二区在线视频| 性久久久久久久久久久久| 亚洲国产一区二区在线| 一本久道久久综合婷婷鲸鱼| 国产日韩亚洲欧美| 欧美国产一区二区| 欧美女主播在线| 午夜精品www| 久久久女女女女999久久| 99国产精品久久久久久久成人热| 亚洲一二三区在线观看| 影院欧美亚洲| 亚洲精品日韩激情在线电影| 国产精品一区二区久激情瑜伽| 老妇喷水一区二区三区| 欧美日韩国产综合新一区| 久久精品日产第一区二区| 欧美激情导航| 久久久成人网| 欧美日韩亚洲免费| 免费久久99精品国产自在现线| 欧美日韩综合精品| 免费观看成人| 国产精品亚洲综合色区韩国| 亚洲国产视频直播| 国产自产精品| 一区二区欧美精品| 亚洲精品国精品久久99热一| 亚洲综合色丁香婷婷六月图片| 亚洲精品无人区| 欧美在线视频一区二区三区| 国产精品99久久久久久www| 快播亚洲色图| 久久看片网站| 国产欧美日韩三区| 亚洲精品欧美精品| 亚洲第一黄网| 久久九九免费视频| 久久成人一区| 国产精品毛片| 亚洲一区国产| 亚洲欧美精品在线| 91久久精品国产91久久性色| 亚洲欧洲99久久| 欧美国产乱视频| 欧美成人有码| 1024日韩| 久久精品理论片| 久久国产成人| 国产麻豆午夜三级精品| 亚洲素人一区二区| 午夜精品成人在线| 国产精品入口| 在线亚洲精品福利网址导航| 99在线精品观看| 欧美精品videossex性护士| 免费一级欧美片在线观看| 国产一区深夜福利| 欧美中文字幕不卡| 一本大道久久a久久综合婷婷| 美女主播一区| 亚洲激情另类| 一区二区三区视频观看| 欧美日韩国产在线播放网站| 亚洲欧洲美洲综合色网| 亚洲日本乱码在线观看| 欧美国产日韩二区| 亚洲伦理久久| 欧美在线免费看| 悠悠资源网久久精品| 免费久久99精品国产自| 欧美福利一区二区| 亚洲精品欧美精品| 欧美日韩综合久久| 亚洲在线免费视频| 老司机亚洲精品| 亚洲日本无吗高清不卡| 欧美日韩mp4| 亚洲欧美日韩综合一区| 蜜桃视频一区| 夜夜嗨av一区二区三区| 国产精品久久久久77777| 午夜精品福利一区二区三区av| 久久米奇亚洲| 亚洲久色影视| 国产欧美一区二区色老头| 久久久久久一区| 一区二区三区视频观看| 久久一综合视频| 中文在线一区| 亚洲成人中文| 国产精品视频福利| 免费不卡在线观看| 亚洲一区二区三区在线观看视频| 蜜臀久久99精品久久久久久9 | 国产精品美女黄网| 久久激五月天综合精品| 91久久久久| 欧美专区在线观看| 日韩性生活视频| 激情久久久久| 国产精品久久久久久久久久久久| 久久久久久9| 亚洲欧美日韩精品久久亚洲区| 欧美11—12娇小xxxx| 欧美一区二区三区啪啪| 9国产精品视频| 亚洲国产精品成人va在线观看| 国产精品美女久久久免费| 欧美激情亚洲| 美女免费视频一区| 久久精品二区| 国产精品一区二区三区免费观看| 亚洲精品免费观看|