1. 程式人生 > >ReactOS學習筆記--編譯和除錯

ReactOS學習筆記--編譯和除錯

前言

本文為該系列部落格的第一篇,本人學習ReactOS的新手一枚,因為很喜歡Windows NT系列的作業系統,一直想要深入的學習和研究一下其內部的原理,以前很早就看到有人說開源作業系統ReactOS架構和Windows NT極其相似,那麼此種情況下,用ReactOS來當做學習的物件最好不過了。

為什麼要學習ReactOS?

我現在本身正在從事軟體開發的職業,見識了程式中各種五花八門的技術,但是這些技術的本身來講,是由Windows NT核心提供的支援,那麼如果在熟悉作業系統結構的情況下,對以後的程式設計以及程式碼編寫將會有很多的好處。正好打算以後想往遊戲反外掛的方向去發展,所以學習作業系統結構更是勢在必行了。

ReactOS

ReactOS(官方網站:http://www.reactos.org)是一款完全開源的仿Windows NT 5 Service Pack 2(5.2)的作業系統,其核心結構和Windows Server 2003的核心結構基本一致。

下載

編譯

編譯整體來說其實非常簡單,只是可能我的搜尋技巧有問題,在編譯過程中一直沒有找到有效的方法。編譯通過加能正常除錯用了好幾天的時候。編譯方式目前提供了三種方式:

  • 1. ReactOS提供的編譯環境;
  • 2. 基於VS IDE命令列的編譯方式;
  • 3. 生成VS sln的方式進行編譯;

基於 ReactOS提供的編譯環境方式:

該方式非常簡單,只需要從ReactOS官方網站下載編譯環境,然後下載安裝然後就可以執行編譯了。地址(ReactOS開發環境下載),

開啟編譯環境之後,執行原始碼根目錄下configure.cmd

完成之後,進入生成的output-MinGW-i386

然後再執行Ninja, 這時候就會進入編譯階段了, 等待編譯完成之後,所有的模組就編譯完成了。

這時候再執行ninja livecd, 或者 ninja bootcd.就會生成可引導的ISO檔案了。

, 這時候用這個檔案就可以放到虛擬機器裡面執行測試了。

2. 基於VS IDE命令列的編譯方式和生成VS sln的方式進行編譯

為什麼這兩種方式要放在一起講,因為其實他們都是使用的相同的方式進行的編譯,一個是基於命令列,都是VS IDE環境進行的編譯,它們在編譯的過程中遇到的問題都是類似的。

我這裡選擇的是VS 2015進行編譯的,還可以使用其他的環境進行編譯。

首先開啟VS 2015 開發者命令列並切換到ReactOS原始碼的根目錄下:

這裡分開講一下,

1. 基於VS IDE命令列的編譯方式, 使用和ReactOS類似的方法進行的配置和編譯,首先執行configure.cmd, 然後切換到生成的同級目錄output-VS-i386下,執行ninja,

2. 生成VS sln的方式進行編譯, 他的方式略微不同,同樣開啟VS 2015開發者命令列,並切換到原始碼根目錄下,並執行"configure.cmd VSSoution" , 這個時候用VS開發環境去開啟output-VS-i386-sln下的REACTOS.sln編譯,也可以在命令列內使用msbuild REACTOS.sln /m執行編譯。

編譯和執行的問題

額外的設定

以上為沒有出錯的編譯過程, 不出錯的情況下,整個過程完成不過20多分鐘。

第一種基於ReactOS編譯環境編譯的檔案,一般不會出現問題;1W多個檔案10多分鐘就編譯完成了。但是我的目的並不是為了編譯和執行它, 我還需要對作業系統進行除錯,ReactOS提供的編譯環境並不支援直接用VS或者Windbg除錯,(沒有PDB檔案)。所以我們需要編譯一個除錯的版本能讓VS環境或者Windbg進行除錯以觀察流程。

在嘗試過程中遇到了很多的錯誤,比如:錯誤報告說檔案內文字編碼無法識別,反正就是各種錯誤都出現了。最後都解決不了。 - -,大體錯誤如下:

f:\open_source\reactos\base\setup\usetup\lang/bg-BG.h: warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss

f:\open_source\reactos\base\setup\usetup\lang/bg-BG.h(47): error C2001: newline in constant
f:\open_source\reactos\base\setup\usetup\lang/bg-BG.h(48): error C2059: syntax error: 'constant'
f:\open_source\reactos\base\setup\usetup\lang/bg-BG.h(56): error C2059: syntax error: '}'
f:\open_source\reactos\base\setup\usetup\lang/bg-BG.h(75): error C2001: newline in constant
f:\open_source\reactos\base\setup\usetup\lang/bg-BG.h(76): error C2059: syntax error: 'constant'

主要需要設定一下作業系統的一些選項並重啟電腦,然後這些編譯問題都可以被解決。

設定1:

將當前作業系統的 locale設定為English, 並且你還需要安裝一個英文的語言。

以前很多的國外專案編譯都是切換一下這個locale就可以正常編譯了,但是這一招對於ReactOS編譯居然不好使。

設定2(修改當前時區並重啟):

以上設定修改並重啟電腦之後,重新去編譯專案你會發現都沒有問題了。

無法載入VS編譯的ISO問題

使用VS編譯的ISO檔案無法在虛擬機器裡面成功引導,估計某個地方有點兒什麼問題。如果不想用VS編譯的檔案,那麼使用第二個編譯方式編譯的出來的檔案就可以滿足除錯需求,如果一定要使用VS裡面編譯的檔案來測試等等。那麼以下方法可以解決VS編譯的ISO無法載入問題。

首先使用ReactOS編譯環境編譯一個可引導的ISO,此處以為bootcd.iso,編譯完成之後,使用軟碟通(ISO編輯軟體)開啟這個ISO, 然後將裡面的檔案都刪除,並將VS編譯的ISO的檔案替換進去,最後儲存。 儲存之後就可以用這個ISO來引導和運行了。 

因為編譯環境的原因,無法直接使用VS編譯的檔案去替換部分的ReactOS編譯環境編譯的檔案,需要完全替換才行正常執行。否則就會出現錯誤。

除錯

除錯我目前使用的方式是Windbg和VS除錯的,其他的除錯方式請參見《ReactOS Debugging》。

關於Windbg的除錯設定, 官網原文如下:

To take full advantage of WinDBG, you need to compile ReactOS with MSVC to get PDB symbols. For MSVC builds this is the default debugging style. If you want to use gcc builds, you need to compile with WINKD option set to TRUE (you can either use CMake-GUI and edit the value after configuring and then reconfigure, or you can edit the default value in the options.cmake file) Another possibility is to replace ntoskrnl.exe and kdcom.dll built with the WINKD = TRUE option. You can also replace kdcom.dll with the one from Windows 2003, which has a few more features such as reconnect and break-in which do not work properly with ReactOS's own kdcom.

大概意思就是,如果要使用Windbg進行除錯的話,那麼需要重新編譯KDCOM.exe和NTOSKRNL.exe,並且需要在編譯的時候加入已處理定義:_WINKD_=1,或者將Windows 2003裡面的kdcom.dll 替換到\ReactOS\system32\kdcom.dll也行。

VS除錯ReactOS

我比較喜歡使用VS進行除錯ReactOS,因為這樣可以直接進行原始碼級除錯,就像直接用VS寫的程式一樣方便,而且同時還支援Windbg命令。

VS除錯的準備:

安裝完成之後,開啟VS是這樣的,

首次執行需要去配置除錯目標,

,

設定完成之後,使用VS附加功能,如下圖所示:

點選附加就進入等待狀態了。

附上一張成功除錯的圖.

結語

完成這些操作才僅僅是學習ReactOS的第一小步,同時也希望能遇到一樣喜歡ReactOS,我們一起成長一起學習。

歡迎加群QQ群號:931238114, 備註:ReactOS學習, 希望大佬來入駐(PS:我還是新手).

下一篇帖子我會介紹ReactOS的啟動流程,以及一些可能作為新手最關心的問題。