由Qmake.exe/QtCreator.exe啟動速度慢挖進去

來源:互聯網
上載者:User

    一直用Qt Creator開發Qt程式,Nokia的Qt Creator實在太慢了,啟動慢,編譯速度也是超級慢。昨天,終於它慢的讓我無法忍受了,我決定拋開手上的一切工作,深入挖掘Qt Creator啟動慢的原因。首先,懷疑是給力的Mcafee企業版卡住程式了。試試把Mcafee的一切監控都關閉,沒效果!然後懷疑係統進程太多了,卸載掉SONY送的一堆無用程式,沒效果!繼續懷疑某些進程與Qt Creator有衝突(Windows7 x64嘛),kill掉所有無關進程,沒效果!重設Windows的系統服務,沒效果!我擦,人品差,Qt Creator與Win7 x64不相容,我的出了這麼個結論。連更改程式相容性設定都不行?!

      正當拿它沒轍時,同學說它電腦上的Qt Creator跑的很歡很開心,也是Win7 x64。太打擊了,都是Win7 x64,為何我這跑龜速?算了,身為軟體開發人員,還是專業點吧,祭出Process Monitor,我偷窺它!呃……x64系統下跑32位程式,一大坨的Wow的dll調用要看吐。

      但是,記錄中一連片的Process Profiling操作耗時很久,1個耗時1秒鐘左右。那Process Profiling是啥呢?後來,查了許多資料,發現它只是當程式空閑時Windows方便統計CPU使用率等效能資訊插入的探測操作。也就是說,這麼大會兒,Qt Creator啥都沒幹?!上面有個Qmake.exe的叫用作業,難道啟動慢跟它有關?找到了Qmake.exe,拿滑鼠敲它兩下,果然一個黑框卡住不動。搞半天,發現Qt Creator啟動慢確實與Qmake啟動慢有關,但也不全怨Qmake,Creator自己也有問題!

      哎,瞅著一大片的Process Profiling沒轍,誰讓我軟體調試沒學好呢。WinDbg不會用呀,就是會用還得弄pdb,弄pdb還得重新編譯Qmake和Qt Creator……無意間,禁用網卡試試,一下把所有網卡全部禁用。Qmake和Qt Creator居然奇蹟般的啟動飛快!這樣行?!那我拿牆堵這倆進程不就好了!開啟落灰的Windows內建防火牆,在進階規則裡禁止Qmake和Qt Creator如站/出站。居然不行!也許這倆程式啟動時在等個什麼結果……能等啥呢?解決網路問題,當然還是要抓包,祭出Wireshark來抓包,居然是這樣:

      NBNS是NetBIOS Name Service的縮寫,貌似Qt Creator在啟動時查詢CMAKE/CMAKE.EXE/SH.EXE這樣的主機名稱?!這行為太匪夷所思了,還是得找源碼看看:

#ifdef Q_OS_WIN

static QStringList detectShellPath()

{

    QStringList paths;

    QString path = qgetenv("PATH");

    QStringList pathlist = path.toLower().split(";");

    for (int i = 0; i < pathlist.count(); i++) {

        QString maybeSh = pathlist.at(i) + "/sh.exe";

        if (QFile::exists(maybeSh)) {

            paths.append(maybeSh);

        }

    }

    return paths;

}

#endif

      這是Qmake的一段代碼,它在啟動時擷取名為“PATH”的環境變數,然後用“;”拆開成為一個QStringList,最後把PATH環境變數中的每個路徑都串連“/sh.exe”成為新路徑,用QFile尋找該路徑是否存在。這樣的的話,怎會產生查詢SH.EXE主機名稱的操作呢?回過頭來,在Qmake啟動的Process Monitor監控記錄中找到如下的操作:

      居然用CreateFile開啟\\sh.exe\,查一下MSDN,CreateFile是這麼理解這種寫法的:\\servername\pipe\pipename。CreateFile居然真的把sh.exe當作伺服器名,來建立一個管道-_-!那這個“\\sh.exe\”是哪來的呢?由上面的代碼,它是從環境變數拼出來的。我看一眼我的PATH環境變數,一下震驚了!!!裡面一段是這樣寫的“;C:\Program Files\WIDCOMM\Bluetooth Software\syswow64;\;”。這個該死的反斜線是啥時候弄出來的!去掉反斜線,再次啟動Qmake和Qt Creator,它倆終於像在我同學電腦上那樣跑的很歡很開心了!

      總結:看似系統問題,實則程式問題;看似程式問題,實則網路問題;看似網路問題,實則環境變數問題!如果Windows防火牆真的能把建立遠程管道操作堵住的話,也許我永遠找不到問題的真相。問題的根源和表象差的好遠呀!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.