發展週期(四):Visual Studio調試

原文連接:https://developer.chrome.com/native-client/devguide/devcycle/vs-addinhtml

注意:已針對ChromeOS之外的平臺公佈了此處所述技術的棄用。
請訪問咱們的 遷移指南 瞭解詳情。
web


使用Visual Studio進行調試

不管您是移植現有項目仍是從頭開始,Native Client Visual Studio加載項均可以經過將Native Client SDK開發工具集成到Visual Studio環境中,更輕鬆地設置,構建,運行和調試Native Client應用程序。chrome

Native Client加載項須要Visual Studio 2012或Visual Studio 2010 Service Pack 1.當前不支持其餘版本的Visual Studio。Visual Studio Express也不受支持。windows

介紹

Visual Studio的Native Client加載項可幫助您以多種方式更有效地開發應用程序:api

  • 將代碼組織和維護爲Visual Studio項目。
  • 迭代地更容易地編寫和測試您的應用程序。Visual Studio處理啓動Web服務器以提供模塊的詳細信息,並在Chrome中運行附帶調試器的模塊。
  • 使用Visual Studio的C / C ++編譯器將模塊編譯爲動態連接庫(DLL),並將其做爲Pepper插件運行。這容許您逐步開發代碼,一次編碼和/或將一個功能移植到Pepper API中,同時繼續使用本機Windows API,不然這些API將在實際的Native Client模塊中不可用。
  • 使用Visual Studio的內置調試器來調試代碼,同時它做爲Pepper插件運行。
  • 使用Native Client SDK工具將模塊編譯爲.nexe或.pexe文件,並將其做爲真正的Native Client模塊運行。
  • 使用Native Client調試器nacl-gdb在代碼做爲Native Client對象運行時測試代碼。

加載項定義了五種新的Visual Studio平臺:PPAPINaCl32, NaCl64NaClARM,和PNaCl。這些平臺能夠應用於解決方案和項目的調試配置。平臺配置項目的屬性,以即可以構建和運行Pepper插件或Native Client模塊。平臺還定義與debug命令關聯的行爲,以便您能夠在Visual Studio中運行時測試代碼。瀏覽器

平臺

將Visual Studio加載項平臺分爲兩組是有幫助的。一個僅包含PPAPI平臺。另外一組,咱們稱之爲本地客戶端平臺,包含了他們的名字,全部有「NaCl」平臺: NaCl32NaCl64NaClARM,和PNaCl。下圖顯示了平臺,它們一般使用的方式以及它們生成的構建產品。緩存

/native-client/images/visualstudio4.png

使用平臺,您的工做流程更快,更高效。您只需單擊一下或按鍵便可編譯,啓動和調試代碼。當您按F5「開始調試」命令時,Visual Studio會自動啓動Web服務器以便爲您的模塊(若是須要)以及運行Native Client模塊的Chrome實例提供服務,而且還會附加適當的調試器。安全

您能夠在工做時切換平臺,以比較代碼的行爲。服務器

運行項目時,Visual Studio以不一樣方式啓動PPAPI和Native Client平臺,以下一節中所述。app

PPAPI平臺

PPAPI平臺將您的模塊構建爲動態庫,並啓動Chrome版本,該版本配置爲在遇到<embed>元素時將庫做爲插件運行type=application/x-nacl(忽略清單文件中的信息)。在PPAPI平臺中運行時,您可使用在構建並做爲.nexe文件運行的常規Native Client模塊中不可用的Windows系統調用。這提供了以遞增方式移植現有代碼的能力,一次使用PPAPI接口重寫功能。因爲該模塊是使用Visual Studio的本機編譯器(MSBuild)構建的,所以您可使用Visual Studio調試器來控制和檢查代碼。

Native Client平臺

有四個Native Client平臺。全部這些均可用於構建Native Client模塊。當您運行其中一個Native Client平臺時,Visual Studio會構建相應類型的Native Client模塊(.nexe或.pexe),啓動Web服務器以提供它,並啓動Chrome的一個副本,該模塊從服務器並運行它。Visual Studio還將打開一個終端窗口,啓動nacl-gdb實例,並將其附加到模塊的進程,以便您可使用gdb命令進行調試。

NaCl32和NaCl64

名爲NaCl32和NaCl64的平臺分別針對x86 32位和64位系統。當您準備好分發應用程序時,您須要兩個平臺來構建一整套.nexe文件。但請注意,在Visual Studio中進行測試時,必須選擇NaCl64平臺(由於Chrome for Windows在64位進程中運行Native Client)。若是您嘗試從NaCl32平臺運行,您將收到一條錯誤消息。

NaClARM

NaClARM平臺針對基於ARM的處理器。您能夠在Visual Studio中使用NaClARM平臺構建.nexe文件,但不能從那裏運行它們。您可使用Visual Studio建立包含基於ARM的.nexe文件的Native Client模塊,而後從ARM設備(例如較新的Chromebook計算機)上的Chrome瀏覽器運行該模塊。有關在Chrome中測試模塊的詳細信息,請參閱運行Native Client應用程序中的說明 。

注意:NaClARM平臺目前僅支持newlib工具鏈。

PNaCl

PNaCl(便攜式NaCl)平臺包含在Visual Studio Native Client加載項1.1及更高版本中。它支持.pexe文件格式。.pexe文件將您的應用程序編碼爲低級虛擬機(LLVM)的bitcode。將Native Client應用程序做爲PNaCl模塊傳遞時,清單文件將包含單個.pexe文件,而不是多個.nexe文件。Chrome客戶端將LLVM bitcode轉換爲本地系統的機器指令。

從Visual Studio運行PNaCl平臺時,Visual Studio使用Native Client SDK將.pexe文件轉換爲NaCl64 .nexe文件並運行它,就像使用NaCl64平臺同樣。

注意:PNaCl平臺目前僅支持newlib工具鏈。

安裝加載項

要使用Native Client Visual Studio加載項,您的開發環境應包括:

  • 64位版本的Windows Vista或Windows 7。
  • Visual Studio 2012或帶Service Pack 1的Visual Service 2010。
  • Chrome版本23或更高版本。您能夠選擇使用最新開發的金絲雀 Chrome瀏覽器構建,運行金絲雀版本並排側(和分開)Chrome瀏覽器的普通版本。
  • 包含pepper_23 或更高版本的Native Client SDK。您使用的Chrome版本必須等於或大於SDK捆綁包的版本。

設置環境變量

在運行安裝程序以前,必須定義兩個Windows環境變量。它們指向您用於構建模塊的Native Client SDK中的捆綁包,以及您選擇用於調試的Chrome瀏覽器。

要在Windows 7中設置環境變量,請轉到「開始」菜單並搜索「環境」。結果中的一個連接是「爲您的賬戶編輯環境變量。」(您也能夠從Control Panel 下方連接到此連接User Accounts。)單擊在連接上並使用窗口中的按鈕來建立或更改這些用戶變量(如下顯示的值僅做爲示例):

變量名 描述
NACL_SDK_ROOT SDK中的pepper目錄的路徑。例如:C:\nacl_sdk\pepper_23
CHROME_PATH 您正在測試的Chrome版本的.exe文件的路徑。例如:C:\Users\fred\AppData\Local\Google\Chrome SxS\Application\chrome.exe

下載add-in

Native Client Visual Studio加載項是名爲SDK的單獨軟件包 vs_addin。打開命令提示符窗口,轉到頂級SDK目錄,而後運行update命令,指定加載項包:

naclsdk update vs_addin

這將建立一個名爲的文件夾vs_addin,其中包含加載項自己,安裝程序文件和示例目錄。

注意:只有naclsdk在Windows系統上運行時,纔會顯示vs_addin軟件包。

運行安裝程序

安裝程序腳本位於vs_addinSDK中的文件夾內。右鍵單擊該文件install.bat並以管理員身份運行它。

該腳本始終安裝NativeClient平臺,並詢問您是否還要安裝PPAPI平臺。您能夠跳過PPAPI步驟並稍後再次運行安裝程序以添加PPAPI平臺。

您一般能夠在沒有參數的狀況下成功運行安裝程序 新平臺安裝在C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms

在某些狀況下,系統資源可能不在其默認位置。運行時可能須要使用這些命令行參數install.bat

  • 假定MSBuild文件夾位於C:\Program Files (x86)\MSBuild。您可使用該標誌指定備用路徑--ms-build-path=<path>。安裝程序假定Visual Studio已在其中建立了用戶文件夾
  • 插件自己一般安​​裝在%USERPROFILE%\My Documents\Visual Studio 2012(或2010年用於Visual Studio 2010)中。您可使用--vsuser-path=<path>標誌指定備用路徑。

有時可能會對Visual Studio加載項進行更新。更新的執行方式與安裝相似。使用naclsdk update下載新的加載項並install.bat以管理員身份運行。

要卸載加載項,請install.bat以管理員身份運行並添加 --uninstall標誌。您須要以管理員身份運行命令提示符程序才能添加標誌。轉到Windows開始菜單,搜索「命令提示符」,右鍵單擊該程序並以管理員身份運行它。

您能夠經過在Visual Studio「工具」菜單中選擇「加載項管理器」來驗證是否已安裝加載項並肯定其版本。若是已安裝加載項,它將顯示在可用加載項列表中。選擇它並閱讀其描述。

嘗試hello_world_gles示例項目

該加載項附帶一個examples目錄。打開示例項目 examples\hello_world_gles\hello_world_gles.sln。該項目是一個顯示旋轉立方體的應用程序。

選擇NaCl64平臺

在Visual Studio中打開示例項目,選擇Configuration Manager,而後確認活動解決方案配置是否Debug爲活動項目平臺NaCl64。請注意,該hello_world_gles項目的平臺 也是NaCl64。(您能夠 Configuration ManagerBuild菜單或項目Properties窗口進入 。)

/native-client/images/visualstudio1.png

構建並運行項目

使用debugging命令(F5)構建並運行項目。隨着車輪開始轉動,您可能會收到一個或多個警報。他們是良性的; 您能夠接受它們並設置選項以在可能的狀況下忽略它們。您可能會看到的一些消息包括:

  • 「這個項目已通過時了,你想創建它嗎?」
  • 「請指定用於調試會話的可執行文件的名稱。」這應該是環境變量CHROME_PATH的值,它一般做爲對話框中的默認值提供。
  • 「沒法找到chrome.exe的調試信息。」這是預期的,您正在調試模塊的代碼,而不是Chrome。
  • 「打開文件 - 安全警告。沒法驗證發佈者。「若是Visual Studio抱怨x86_64-nacl-gdb.exe,那就是咱們的調試器。隨它去。

一旦你經過這些障礙,應用程序就會開始運行,你會在三個地方看到活動:

  1. 終端窗口打開運行nacl-gdb
  2. Chrome會在標籤頁中啓動運行您的模塊。
  3. 選擇調試輸出項時,Visual Studio輸出窗口將顯示調試消息。關閉Chrome窗口中止調試會話,或從調試菜單中選擇中止調試命令。中止運行程序時,nacl-gdb窗口將關閉。

測試nacl-gdb調試器

在函數MainLoop中的SwapBuffers調用中添加一個斷點,該函數位於hello_world.cc中。

/native-client/images/visualstudio2.png

再次啓動調試器(F5)。此次將現有斷點加載到nacl-gcb中,程序將在那裏暫停。輸入c繼續運行。您可使用gdb命令設置更多斷點並逐步執行應用程序。有關詳細信息,請參閱使用nacl-gdb進行調試(向下滾動到本節末尾以查看一些經常使用的gdb命令)。

測試Visual Studio調試器

若是您已安裝PPAPI平臺,請返回Configuration Manager並選擇PPAPI平臺。此次Chrome啓動 nacl-gdb窗口時不會出現; Visual Studio調試器徹底參與並在工做中。

檢查平臺屬性

此時,查看與PPAPI和Native Client平臺關聯的屬性可能會有所幫助 - 請參閱示例項目中的設置做爲示例。

在Visual Studio中爲Native Client開發

在安裝了加載項並嘗試了示例項目以後,您就能夠開始使用本身的代碼了。您能夠經過使用本身的源代碼替換源代碼來重用示例項目及其已有的PPAPI和Native Client平臺。更有可能的是,您將平臺添加到現有項目或從頭建立的新項目。

將平臺添加到項目中

請按照如下步驟將Native Client和PPAPI平臺添加到項目中:

  1. 打開配置管理器。
  2. 在與項目對應的行上,單擊「平臺」列下拉菜單,而後選擇<New...>
  3. 選擇PPAPINaCl32NaCl64,或PNaCl在新的平臺菜單。
  4. 在大多數狀況下,您應該<Empty>在「從如下位置複製設置」菜單中進行選擇。 切勿在``PPAPI``,``NaCl32``,``NaCl64``,``NaClARM``或``PNaCl``平臺之間複製設置。您能夠從Win32平臺複製設置(若是存在),但以後確保爲新平臺正確設置項目屬性,以下面的步驟6中所述。
  5. 若是您願意,請選中「建立新的解決方案平臺」框以建立除項目平臺以外的解決方案平臺。(這是可選的,但它能夠很方便,由於它容許您經過選擇具備相同名稱的解決方案平臺從Visual Studio主窗口切換項目平臺。)
  6. 查看剛剛添加的新平臺的項目屬性。在大多數狀況下,每一個平臺的默認屬性應該是正確的,但檢查是值得的。您可能已經預先設置或從Win32平臺複製的自定義屬性要特別當心。同時確認配置類型是否正確:
    • Dynamic Library 對於 PPAPI
    • Application (.pexe) 對於 PNaCl
    • Application (.nexe)NaCl32NaCl64NaClARM

選擇工具鏈

直接從SDK構建Native Client模塊時,可使用兩個不一樣的工具鏈newlib或glibc。有關兩個工具鏈的說明以及如何使用glibc工具鏈構建和部署應用程序的說明,請參閱動態連接和使用glibc加載。Native Client平臺爲您提供相同的工具鏈選擇。您能夠在項目屬性中指定要使用的工具鏈 Configuration Properties > General > Native Client > Toolchain

目前,NaClARM和PNaCl平臺僅支持newlib工具鏈。

PPAPI平臺沒有工具鏈屬性。PPAPI平臺使用Visual Studio附帶的工具鏈和庫。

將庫添加到項目中

若是您的Native Client應用程序須要SDK中未包含的庫,則必須將它們添加到項目屬性(下Configuration Properties > Linker > Input > Additional Dependencies),就像任何其餘Visual Studio項目同樣。此依賴項列表是以分號分隔的列表。在PPAPI平臺上,庫名稱包括.lib擴展名(例如,ppapi_cpp.lib;ppapi.lib)。在Native Client平臺上,擴展名被排除(例如ppapi_cpp;ppapi)。

運行Web服務器

爲了使Visual Studio加載項可以測試Native Client模塊,您必須從Web服務器提供模塊。有兩種選擇:

運行本身的服務器

當您開始調試運行時,Visual Studio會啓動Chrome並嘗試使用Chrome命令參數中的地址鏈接到Web服務器(請參閱項目的調試>命令配置屬性),這一般是 localhost:$(NaClWebServerPort)。若是您使用本身的服務器,請確保在命令arguments屬性中指定其地址,並在啓動調試會話以前確認您的服務器正在運行。還要確保服務器具備傳送Native Client模塊所需的全部文件(請參閱下面的「跟蹤全部部分」)。

運行SDK服務器

若是指定端口上沒有運行Web服務器,Visual Studio將嘗試啓動Native Client SDK附帶的簡單Python Web服務器。它在SDK自己(at %NACL_SDK_ROOT%\tools\httpd.py)和項目目錄($(ProjectDir)/httpd.py)中查找服務器的副本 。若是服務器位於其中一個位置,Visual Studio將啓動服務器。服務器輸出顯示在Visual Studio的「輸出」窗口中,位於名爲「Native Client Web Server Output」的窗格中。以這種方式啓動的服務器在調試會話結束時終止。

跟蹤全部碎片

不管Web服務器在何處或如何啓動,您都必須確保它具備您的應用程序所需的全部文件:

  • 全部Native Client應用程序都必須具備html主頁。一般會調用此文件index.html。主機頁面必須具備其type屬性設置爲的embed標記 application-type/x-nacl。若是您計劃使用Native Client平臺,則embed標記還必須包含指向Native Client清單(.mnf)文件的src屬性。
  • 若是您使用的是Native Client平臺,則必須包含有效的 清單文件。清單文件指向Visual Studio構建的.pexe或.nexe文件。這些將放在項目General > Output Directory 配置屬性中指定的目錄中,一般是這樣$(ProjectDir)$(ToolchainName)。Visual Studio可使用Native Client SDK腳本create_nmf.py爲您自動生成清單文件。要使用此腳本,請將項目的Linker > General > Create NMF Automatically屬性設置爲「是」。

若是您讓Visual Studio發現並運行SDK服務器,則應將這些文件放在項目目錄中。若是您正在運行本身的服務器,則必須確保主機頁面index.html位於服務器的根目錄中。請記住,若是您使用的是其中一個Native Client平臺,則必須能夠從服務器訪問清單文件和.pexe或.nexe文件的路徑。

若是您的應用程序使用Native Client動態連接庫的能力,則清單文件的結構可能會更復雜。您可能必須向清單文件添加有關動態連接庫的其餘信息,即便您自動建立它也是如此。在爲動態連接的應用程序生成本機客戶端清單文件中介紹了create_nmf工具的用法和限制。

您能夠查看SDK中的示例項目,以瞭解索引和清單文件的組織方式。示例項目hello_nacl還有一個名爲的子目錄hello_nacl。該文件夾包含index.html 和hello_nacl.nmf。nexe文件位於NaCl64\newlib\Debug\hello_nacl_64.nexe。該hello_world_gles示例項目包含一個名爲的子目錄hello_world_gles`。該目錄包含使用工具鏈(index_glibc.html和 index_newlib.html)構建的html文件。.newe和.nmf文件位於newlib和glibc子文件夾中。有關Native Client應用程序部分的其餘信息,請參閱應用程序結構

使用調試器

PPAPI插件由Visual Studio的編譯器(MSBuild)本機構建,並以一般的方式與Visual Studio的調試器一塊兒使用。您能夠在開始調試以前在Visual Studio源代碼文件中設置斷點,並在運行程序時即時設置。

沒法從Visual Studio運行或調試NaCl32和NaClARM可執行文件(.nexe文件)。

NaCl64可執行文件(.nexe文件)使用SDK中的一個Native Client工具鏈進行編譯,該工具鏈建立一個ELF格式的可執行文件。要調試正在運行的.nexe,必須使用nacl-gdb,它是一個不直接與Visual Studio集成的命令行調試器。當您啓動從NaCl64平臺運行的調試會話時,Visual Studio會自動爲您啓動nacl-gdb並將其附加到nexe。在開始調試以前在Visual Studio中設置的斷點將自動傳輸到nacl-gdb。在NaCl調試會話期間,您只能使用nacl-gdb命令。

PNaCl平臺生成.pexe文件。運行調試器時,加載項會將.pexe文件轉換爲.nexe文件,並運行附加了nacl-gdb的結果二進制文件。

有關nacl-gdb的其餘信息,請參閱使用nacl-gdb進行調試(向下滾動到本節末尾以查看一些經常使用的gdb命令)。

請注意,您不能在Debug配置中使用Start Without Debugging命令(Ctrl + F5)和項目。若是您這樣作,Chrome將會掛起,由於調試平臺使用命令參數--wait-for-debugger-children(在PPAPI中)或--enable-nacl-debug(在Native Client平臺中)啓動Chrome 。這些標誌會致使Chrome暫停並等待調試程序附加。若是您使用Start Without Debugging命令,則不會附加調試器,Chrome只會耐心等待。要使用Start Without Debugging,請切換到Release配置,或從Command Arguments屬性中手動刪除有問題的參數。

禁用Chrome緩存

使用Native Client平臺進行調試時,您可能但願禁用Chrome的緩存,以確保您正在測試最新且最好的代碼。

關於PostMessage的警告

某些Windows庫將符號定義PostMessagePostMessageW。若是您正在使用PPAPI平臺而且PostMessage()在模塊中使用Pepper 調用,這可能會形成嚴重破壞。當您在PPAPI平臺上進行測試時,某些Pepper API頭文件包含您可能須要的自我防護修復程序。這裏是:

// If Windows defines PostMessage, undef it.
#ifdef PostMessage
#undef PostMessage
#endif

在Windows Studio中將Windows應用程序移植到Native Client

在Google I / O 2012上,咱們演示瞭如何在60分鐘內將Windows桌面應用程序移植到Native Client。該視頻可在YouTube上觀看。該vs_addin/examples文件夾包含一對演示移植過程的簡單示例。它們的設計僅需5分鐘便可完成。這兩個例子被稱爲hello_nacl和 hello_nacl_cpp。它們基本相同,但前者使用C PPAPI接口,然後者使用C ++ API。該應用程序是熟悉的「Hello,World」。

每一個示例都以Win32 平臺中運行的Windows桌面版本開頭。從那裏移動到PPAPI平臺,在那裏執行一系列步驟來設置Native Client框架,使用它來運行桌面版本,而後將行爲從Windows調用移植到PPAPI接口。你風與使用沒有Windows功能,既能夠在運行程序PPAPINaCl64平臺。

示例項目使用單個源文件(hello_nacl.c或 hello_nacl_cpp.cpp)。移植過程當中的每一個步驟都是經過逐步定義源中的符號STEP1到STEP6來完成的。內聯註釋解釋了每一個連續步驟如何更改代碼。查看示例代碼以瞭解它是如何實際完成的。如下是該過程的摘要:

Win32平臺

第1步運行桌面應用程序

首先在Win32平臺上運行原始Windows應用程序。

PPAPI平臺

STEP2使用空的Native Client模塊啓動Chrome

切換到PPAPI平臺幷包含初始化本機模塊實例所需的代碼。代碼是無懈可擊的,它只是初始化模塊。此步驟說明了Visual Studio如何處理啓動Web服務器和Chrome以及將Native Client模塊做爲Pepper插件運行的全部詳細信息。

步驟3從Native Client模塊同步運行桌面應用程序

Native Client直接建立窗口,而後調用WndProc來運行桌面應用程序。因爲WndProc在其消息循環中旋轉,所以初始化模塊的調用永遠不會返回。關閉Hello World窗口,模塊初始化完成。

STEP4異步運行桌面應用程序和Native Client

在WndProc中,使用回調函數替換消息循環。如今,應用程序窗口和Native Client模塊同時運行。

STEP5將輸出重定向到網頁

模塊初始化代碼調用initInstanceInBrowserWindow而不是initInstanceInPCWindow。WndProc已再也不使用。相反,調用postMessage將文本(如今是「Hello,Native Client」)放在網頁中,而不是打開和寫入窗口。到達此步驟後,您能夠一次開始將應用程序的各個部分移植到其中。

STEP6刪除全部Windows代碼

全部Windows代碼都被刪除,證實咱們符合PPAPI標準。正在運行的功能代碼與STEP5相同。

NaCl64平臺

在NaCl64平臺中運行Native Client模塊

您仍在運行STEP6代碼,可是做爲Native Client模塊而不是Pepper插件。

CC-By 3.0許可下提供的內容

相關文章
相關標籤/搜索