天天看點

firefox調試記錄1——用VS2010調試跟蹤firefox8

我需要對firefox進行跟蹤調試,以便盡快搞清楚firefox的工作流程。我想用VS2010來做,在網上沒有找到操作方法,不過網上有利用VS2005和VS2008進行調試的例子。參照其步驟,我來探究一下如何使用VS2010對Firefox進行調試。參考資料:

Debugging Firefox using Visual Studio .NET 2005

Debugging Firefox using Visual Studio .NET 2008 (2005)(完美調試firefox)

如何用vc調試firefox(本文後面部分也引用了前面第一個連結)

下面是我嘗試用VS2010(我使用的是VS2010中文旗艦版)調試Firefox的記錄:

第一步:利用源代碼編譯firefox。這個過程有專門的教程類文章,我使用的是firefox的8.0版本的源代碼。之前我也編譯過,但是都是預設的選項,我現在需要編譯可以調試的debug版,是以我從新編譯一遍。我的mozconfig檔案内容是:[email protected]@/ff-dbgac_add_options--enable-application=browserac_add_options--disable-optimizeac_add_options --enable-debug這樣寫不一定是最好的,但至少是可用的,我用這個編譯通過了。

第二步,啟動VS2010,選擇檔案->打開->項目/解決方案,選擇相應目錄下的firefox.exe。打開。這個可以參考前面給出的資料連結。

firefox調試記錄1——用VS2010調試跟蹤firefox8

第三步,設定環境。右鍵點選上圖所示的firefox,選擇屬性,出現屬性頁,該頁面與資料中VS2005和VS2008的都不大一樣。如下圖:

firefox調試記錄1——用VS2010調試跟蹤firefox8

我在這裡糾結了很久。因為不知道怎樣将資料中說的環境設定MOZ_NO_REMOTE=1添加進去(可能是我對VS操作不熟悉吧),後來才知道可以點選環境右邊的按鈕,然後彈出一個視窗,如下圖:

firefox調試記錄1——用VS2010調試跟蹤firefox8

我将MOZ_NO_REMOTE=1添加進去了。點選确定。完成了其他相關資料中說的步驟了。

第四步,跟蹤firefox執行過程。跟蹤第一遍,直接按F10,程式開始執行,出現了一個控制台視窗,

firefox調試記錄1——用VS2010調試跟蹤firefox8

同時程式運作到nsWindowsWMain.cpp檔案中的vmain函數處,如下圖所示:

firefox調試記錄1——用VS2010調試跟蹤firefox8

一直按F10直到firefox打開,這個過程中,控制台輸出了很多内容(估計這就是debug版的好處吧)。Firefox打開的是火狐首頁,如下圖所示:

firefox調試記錄1——用VS2010調試跟蹤firefox8

Firefox打開的時候程式運作到如下圖所示的地方,我在這裡設定斷點,然後結束這一遍調試

firefox調試記錄1——用VS2010調試跟蹤firefox8

跟蹤第二遍,按F5運作,程式斷在上圖設定斷點的地方。然後按F11跟進。來到了nsBrowserApp.cpp檔案中的函數main如圖:

firefox調試記錄1——用VS2010調試跟蹤firefox8

接着一直按F10,直到firefox打開,這個過程中,控制台依然輸出很多内容。Firefox打開了火狐首頁,此時程式運作到了該檔案中如下圖所示的地方,在這裡設定斷點,然後結束這一遍調試:

firefox調試記錄1——用VS2010調試跟蹤firefox8

跟蹤第三遍,按F5運作,程式斷在第一個斷點處,再按F5,程式在上圖設定斷點的地方斷下。然後按F11跟進。依然在nsBrowserApp.cpp檔案中,來到了函數do_main如圖:

firefox調試記錄1——用VS2010調試跟蹤firefox8

接着一直按F10,直到firefox打開,此時程式運作到了該檔案中如下圖所示的地方,在這裡設定斷點,然後結束這一遍調試:

firefox調試記錄1——用VS2010調試跟蹤firefox8

跟蹤第四遍,按F5運作,此時已經設定了三個斷點了,總共按三次F5。程式在上圖設定斷點的地方斷下。然後按F11跟進。來到了nsAppRunner.cpp檔案中的函數XRE_main處,如圖:

firefox調試記錄1——用VS2010調試跟蹤firefox8

接着一直按F10,直到firefox打開,此時程式運作到了該檔案中如下圖所示的地方,在這裡設定斷點,然後結束這一遍調試:

firefox調試記錄1——用VS2010調試跟蹤firefox8

跟蹤第五遍,按F5運作,此時已經設定了四個斷點了,總共按四次F5。程式在上圖設定斷點的地方斷下。然後按F11跟進。來到了nsCOMPtr.h檔案中如下圖所示的地方:

firefox調試記錄1——用VS2010調試跟蹤firefox8

同時控制台輸出:

firefox調試記錄1——用VS2010調試跟蹤firefox8

接着繼續按F10,按了幾次又回到的剛才下斷點的地方,經過多次在這裡摸索,我發現該斷點是SelectProfile函數,其第一個參數是函數getter_AddRefs(profileLock)的傳回值,是以我感覺前面輸出的控制台提示就是這個函數執行的時候産生的,于是在回到這個斷點的位置時,我繼續按F11,這次來到了nsCOMPtr.h檔案中getter_AddRefs函數處,如下圖:

firefox調試記錄1——用VS2010調試跟蹤firefox8

接着繼續按F10,按了兩次再次回到第四個斷點處。在這個斷點處按F10必定會打開profilemanager,選擇之後就打開了firefox,有了前面的經曆,這次我按F11,運作到了nsCOMPtr.h檔案中如下圖所示的地方:

firefox調試記錄1——用VS2010調試跟蹤firefox8

接着繼續按了兩次F10,又回到第四個斷點處。我還按F11,這次來到了nsAppRunner.cpp檔案中的函數SelectProfile函數的實作處:

firefox調試記錄1——用VS2010調試跟蹤firefox8

在該函數的結尾處,調用了函數ShowProfileManager,從其名稱可知,該函數要打開ProfileManager了。再F10則打開ProfileManager。選擇profile之後,經過一番運作就打開了firefox。在這裡設定第五個斷點,待會兒在這裡按F11跟進去:

firefox調試記錄1——用VS2010調試跟蹤firefox8

跟蹤第六遍,按F5運作,此時已經設定了五個斷點了,總共按五次F5。程式在上圖設定斷點的地方斷下。然後按F11跟進。又來到了nsCOMPtr.h檔案中,如下圖:

firefox調試記錄1——用VS2010調試跟蹤firefox8

這裡按兩次F10,依然傳回到了第五個斷點處。在第五個斷點處再次按F11跟進,來到函數ShowProfileManager的實作代碼處,如下圖:

firefox調試記錄1——用VS2010調試跟蹤firefox8

在這裡一直按F10,直到如下圖所示的函數windowWatcher->OpenWindow處,這個函數運作之後,控制台輸出更多内容,并彈出profilemanager,選擇profile之後暫時沒打開firefox:

firefox調試記錄1——用VS2010調試跟蹤firefox8
firefox調試記錄1——用VS2010調試跟蹤firefox8

函數ShowProfileManager的最後一句為:returnLaunchChild(aNative);這裡按F10的話就會打開firefox了,在這裡設定第六個斷點,待會兒F11跟進,如下圖:

firefox調試記錄1——用VS2010調試跟蹤firefox8

跟蹤第七遍,按F5運作,此時已經設定了六個斷點了,總共按六次F5。程式在上圖設定斷點的地方斷下。然後按F11跟進。又來到了檔案nsAppRunner.cpp的LaunchChild函數的實作代碼處,如下圖:

firefox調試記錄1——用VS2010調試跟蹤firefox8

一直按F10,直到如下圖所示的地方,這一句執行F10的話會打開firefox,在這裡設定第七個斷點,待會兒F11跟進:

firefox調試記錄1——用VS2010調試跟蹤firefox8

跟蹤第八遍,按F5運作,此時已經設定了七個斷點了,總共按七次F5。程式在上圖設定斷點的地方斷下。然後按F11跟進。又來到了檔案nsTString.h檔案中如下圖所示的位置:

firefox調試記錄1——用VS2010調試跟蹤firefox8

直接F10回到了第七個斷點處,再按F11,來到nsWindowsRestart.cpp檔案中WinLaunchChild函數實作代碼處,如下圖:

firefox調試記錄1——用VS2010調試跟蹤firefox8

一直按F10,到如下圖所示的地方:

firefox調試記錄1——用VS2010調試跟蹤firefox8

發現調用的函數又是WinLaunchChild,于是F11跟進,如下圖又有一個WinLaunchChild的實作,應該是函數重載:

firefox調試記錄1——用VS2010調試跟蹤firefox8

這裡繼續按F10,直到下圖所示的位置,CreateProcessW運作之後firefox就打開了,在這裡設定第八個斷點:

firefox調試記錄1——用VS2010調試跟蹤firefox8

跟蹤第九遍,按F5運作,此時已經設定了八個斷點了,總共按八次F5。程式在上圖設定斷點的地方斷下。然後按F11,依然打開了firefox。也就是說,在這裡不管是按F10還是F11都會打開firefox。即無法繼續跟蹤其調用過程了。函數CreateProcessW看起來是windows 的API,檢視一下MSDN,我發現了CreateProcess是屬于Kernel32.lib庫,該函數在Winbase.h中聲明,使用這個函數需要包含windows.h頭檔案。是以确定這個函數是windows API函數。

經過這一遍的跟蹤,發現firefox運作過程大體上是先選擇使用者profile,然後打開相關網頁,其實這個過程不進行跟蹤都知道,但是經過這番跟蹤,對這個過程有了深刻的印象。這裡firefox打開的是firefox首頁,相當于打開一個空白頁。是以下次調試打算讓firefox打開首頁,如:百度。

以上文字是我一邊跟蹤一邊寫下來的。當然實際上不止跟蹤了9遍,也不止下了8個斷點,但是我感覺這幾遍跟蹤和這幾個斷點是比較重要的,而其他我感覺不重要的斷點就直接用完就删除了,也沒有在文中提及。

這裡還有一些懸而未決的疑問,首先:環境設定是否正确,我沒有十足的把握,我懷疑不設定那個MOZ_NO_REMOTE=1也可以進行調試,但我不确定;另外,某些資料中說可以把需要設定斷點的檔案添加進來,然後設定斷點進行調試,但是這裡我是直接單步運作,然後當程式運作到某個檔案的時候,有源代碼的檔案都由VS自動打開了,我沒有手動添加任何源代碼進來。

最後想說這個大型的源代碼跟蹤起來就是累啊~搗鼓了這麼久跟蹤了N多遍,才走完程式的一個小分支。。。

繼續閱讀