宣布VS GDB调试器扩展

今年早些时候 我写了一篇文章 如何在VisualStudio上调试Linux上的C++代码。虽然有点麻烦,但还是可行的。今天我们发布 Visual Studio GDB调试器扩展 预览 . 这将允许调试远程Linux目标,包括物联网设备。

null

要使用这个扩展,需要使用VisualStudio 2015社区或更高版本安装Android的VisualC++工具。这些工具使用开源的MIEngine,它支持visualstudio调试器使用GDB和LLDB使用的机器接口。  GDB调试器扩展引入了一种新的项目类型,它显示了其他项目属性,这些属性允许您在本地或远程(包括在远程Linux目标上)将visualstudio调试器连接到GDB。

开始吧 从VS库下载GDB调试器扩展 然后安装。本文将详细介绍如何使用这个扩展,从项目创建到F5,包括如何为SSH配置Windows和Linux环境。下周我会发一篇文章,教你如何用这个搭配树莓皮。

项目创建

在安装扩展后,创建一个新项目,然后在VisualC++、跨平台上找到一个新的MaFaFixProjkGDB模板。

图片[1]-宣布VS GDB调试器扩展-yiteyi-C++库

当我们选择它并创建一个新项目时,我们会得到一个新的空解决方案,其中包含一些支持文件和自述文件。下面介绍了自述中的大部分内容,但有更多图片。

如果我们快速查看项目属性,您将看到在调试选项卡下,我们为远程和本地GDB调试器添加了选项。我们将在下面更详细地介绍这些选项。

图片[2]-宣布VS GDB调试器扩展-yiteyi-C++库

一旦配置好你 可以点击你设置的任何断点,你习惯的普通VS调试器体验就会出现;窥视、监视、设置和删除断点等。

配置SSH

本地SSH客户端

首先,您需要获得一个本地SSH客户机。你可以用 您选择的SSH客户机,例如 OpenSSH的Win32端口 , 油灰 , 工具链 ,或 赛文 . SSH客户机将用于将机器接口命令安全地隧道到远程GDB可执行文件。

对于PuTTY,需要使用plink.exe作为SSH可执行文件。您可能还需要完整的putty.exe客户端和pscp.exe,以便将文件复制到您的Linux机器上。您需要puttygen.exe来创建SSH访问的私钥。Win32 OpenSSH端口中的工具和Putty中的工具可用于VS中的NMake构建步骤。请注意,基于MinGW/Cygwin的SSH对于SSH可执行文件很好,但由于我们如何在VS中启动进程,因此无法从构建步骤中使用。

在Windows上创建密钥

此时,我们无法支持具有密码短语的证书。

要为Win 32 OpenSSH生成私钥/公钥,请使用ssh keygen实用程序,如下所示 ssh-keygen.exe-t rsa-f您的密钥

您的私钥将位于上面指定为yourkey的文件中,而公钥将位于yourkey.pub文件中。

对于PuTTY,您需要通过运行puttygen并单击generate来创建一个可用于SSH身份验证的证书。

图片[3]-宣布VS GDB调试器扩展-yiteyi-C++库

保存私钥和公钥以在后续步骤中使用。

在Linux机器上添加公钥

在Linux机器上,需要将公钥添加到~/.ssh/authorizedu keys文件中。 如果它不存在,看看下面如何创建它。每个公钥应该在一行上。一旦文件已经存在,就可以按如下方式执行此操作。 nano~/.ssh/授权的u密钥

图片[4]-宣布VS GDB调试器扩展-yiteyi-C++库

在编辑器中,这将调用右键单击新行以插入复制的公钥文本。上面的屏幕截图显示了我添加了两个键的文件。按ctrl-x退出,提示您保存。 如果文件不存在,请先执行以下操作: mkdir~/.ssh文件 触摸~/.ssh/授权的u键 chmod 0700~/.ssh文件 chmod 0600~/.ssh/授权的u密钥

正在连接SSH

要从SSH客户端连接,请执行以下操作: ssh.exe-i私钥 user@host 要从PuTTY连接,请加载保存的会话,然后转到“连接”、“数据”并设置用户名。现在在连接下展开 SSH和Auth下 节点添加保存的私钥。返回会话页面并保存它。现在您可以使用密钥打开会话,而无需密码。只需双击会话名称即可打开它。

图片[5]-宣布VS GDB调试器扩展-yiteyi-C++库

在第一次连接时,系统将提示您将主机另存为受信任连接。在其他工具可以从visualstudio中通过cert auth进行连接之前,必须通过SSH客户机执行此操作。

在azurelinux虚拟机上进行GDB调试

当我们用一个azurevm来描述这一点时,对于任何运行Linux的机器,无论是托管/本地VM、服务器还是设备,原则都是相同的。我们对远程Linux目标的唯一真正要求是,您可以使用证书通过SSH安全地连接,并且GDB存在。如果您需要有关Azure Linux虚拟机入门的帮助,请访问此处。

对于你的来源,你可能已经有了一些东西。如果您确实通过添加现有项来添加它,请右键单击VS项目。你也可以添加一个新的项目,如果你只是尝试这个。在本例中,我添加了一个新的item main.cpp,并添加了以下内容。 #包括 使用名称空间标准;

int main() { int循环=10; 对于(int i=0;i<回路;i++){ cout<<“循环数”<

源代码显然不有趣,它只是在这里练习下面的步骤。

您需要获取远程计算机的地址,例如myServer.cloudapp.net。你可以通过选择你的虚拟机并复制主页上的DNS地址在Azure门户中获得它。

图片[6]-宣布VS GDB调试器扩展-yiteyi-C++库

在这个例子中,我将使用Putty工具进行连接。无论使用哪种工具,您都希望至少连接到远程目标一次,以便在VS中编写连接脚本之前接受将其添加到受信任主机的提示。

从调试器选项卡转到项目的属性,并将“调试器启动”设置为“远程GDB”。

图片[7]-宣布VS GDB调试器扩展-yiteyi-C++库

这里我需要设置我的主机名、用户名、私钥和要使用的安全shell。当使用腻子工具时,我需要使用plink,因为它是用于管道命令的工具,而不是交互式腻子终端。现在我可以设置远程工作目录和远程可执行文件。我没有可执行文件的参数,gdb可以作为我的远程调试器可执行文件。应用这些更改,以便在创建build命令时可以看到这些值。

为此,我们将使用PuTTY提供的pscp,并结合我们在build选项卡中针对私钥、用户、主机和远程工作目录的参数。当您以这种方式将文件复制到Linux主机时,请确保您使用的远程目录已经存在。接下来,我们将使用远程可执行文件名指定build命令行,作为通过plink传递的命令。注意:如果参数值中有空格,应该用引号转义。我们在项目属性的Nmake选项卡的build命令行中指定这些属性。

图片[8]-宣布VS GDB调试器扩展-yiteyi-C++库

如果您打开该行进行编辑,您将能够看到评估的参数名称。 c:oolspscp.exe-i$(PrivateKey)“c:UsersmgoodnerDocumentsVisual Studio 2015ProjectsProject1Project1main.cpp”  $(RemoteUserName)@$(RemoteHostName):$(RemoteWorkingDirectory)/main.cpp $(SecureShellExecutable)$(RemoteUserName)@$(RemoteHostName)-i$(PrivateKey)“cd$(RemoteWorkingDirectory);g++-g main.cpp-o$(远程可执行文件)

图片[9]-宣布VS GDB调试器扩展-yiteyi-C++库

现在我们看到调试器被设置为远程GDB,在循环中设置一个断点,您就可以使用F5了。

图片[10]-宣布VS GDB调试器扩展-yiteyi-C++库

让它建立起来,我们看到我们达到了我们的突破点。你会得到的 您期望的正常功能,例如设置和删除断点、添加监视等。如果您使用ssh客户机连接到计算机,您将看到 出现在遥远的目的地 也可以直接在那里运行可执行文件。

如果遇到错误,并且输出窗口中显示“不支持多个远程源”的消息,请检查主机名末尾是否有空格,如果有,请将其删除。

本地GDB调试

除了Linux之外,还可以在Windows上使用GDB调试器扩展,例如使用MinGW。请注意,您希望您的MinGW-bin文件夹(例如C:MinGWin)位于您的路径上。这为我们提供了GNU编译器、gcc、g++和gdb调试器,我们将在这里描述它们。让我们修改上面示例中的项目属性以在本地运行。将调试器从远程GDB更改为本地GDB。

图片[11]-宣布VS GDB调试器扩展-yiteyi-C++库

对于我们将指定源所在位置的完整路径的选项,请不要让选择对话框使用“.”约定。我们可以指定可执行文件名,gdb在我们的路径上就可以了。

图片[12]-宣布VS GDB调试器扩展-yiteyi-C++库

现在告诉VS如何构建这个。在NMake上编辑build命令行。首先点击“应用”,这样我们就可以看到调试选项卡上设置的值。我们将使用g++来构建它,因为它已经是我的全局路径的一部分了,我们将在工作目录中传递源代码,告诉它发出调试符号并输出我们在工作目录中指定的可执行文件名。

图片[13]-宣布VS GDB调试器扩展-yiteyi-C++库

我们现在可以看到调试器被设置为本地GDB,现在可以使用F5。

图片[14]-宣布VS GDB调试器扩展-yiteyi-C++库

我们会让它建立,我们看到我们再次击中我们的断点。

有关编写构建脚本的更多信息

“调试”选项卡中的项目属性都可在NMake build命令行中使用。请注意,您可以设置远程和本地GDB的值,以便在生成命令行中使用,即使您只启动其中一个。可用属性包括: 主机名:$(RemoteHostName) 用户名:$(RemoteUserName) 私钥:$(PrivateKey) 安全Shell可执行文件:$(SecureShellExecutable) 远程工作目录:$(RemoteWorkingDirectory) 远程可执行文件名:$(RemoteExecutable) 远程可执行参数:$(RemoteExecutableArguments) 远程调试器可执行文件:$(RemoteDebuggerExecutable) 本地工作目录:$(LocalWorkingDirectory) 本地可执行文件:$(LocalExecutable) 本地可执行参数:$(LocalExecutableArguments) 本地调试器可执行文件:$(LocalDebuggerExecutable) 本地调试器服务器地址:$(LocalDebuggerServerAddress)

要以Linux为目标,源代码必须构建在远程Linux机器上。通过从build命令行调用pscp,您可以将源代码复制到远程Linux机器。使用plink可以在远程Linux机器的源代码上调用编译器。plink命令能够执行远程目标支持的任何命令。

下面是一个使用PuTTY工具的远程文件复制和生成命令行示例: pscp.exe-i$(私钥)源.cpp  $(RemoteUserName)@$(RemoteHostName):$(RemoteWorkingDirectory)/source.cpp plink.exe$(RemoteUserName)@$(RemoteHostName)-i$(PrivateKey)“cd$(RemoteWorkingDirectory);g++-g source.cpp-o$(远程可执行文件)

注意,我们不支持从build命令行调用MinGW/Cygwin SSH工具,这是由于我们如何启动该进程。您可以在这里使用OpenSSH的PowerShell工具端口,包括它们的sftp实现。

下面是一个在本地Windows机器上构建的示例(假定g++在全局路径上)。 g++$(LocalWorkingDirectory)source.cpp-g-o  $(LocalWorkingDirectory)$(本地可执行文件)

结论

这是我们的第一个预览版本,我们需要你的反馈,什么对你有用,什么不对。我们希望听到你们中那些构建跨平台应用程序、在大型Linux服务器上运行服务的人的声音,当然还有那些拥有我希望你们连接到Azure IoT的设备的人的声音。我们希望定期发布,并致力于通过本地GDB服务器实现这一点,本地GDB服务器与片上调试器接口,用于更小的设备目标。如果你对此感兴趣,请通过博客与我们联系,或者你可以在Twitter上找到我 @机器人爸爸 .

–马克·古德纳

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享