发展周期(四):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许可下提供的内容

相关文章
相关标签/搜索