Share via


从Visual Studio到Linux上调试C++代码

[原文发表地址] Debug C++ code on Linux from Visual Studio

[原文发表时间] 2015/4/29 10:00 PM

正如您可能已经听说的那样,Visual Studio 2015新推出了对Android开发的GDB支持。有趣的是,因为这项功能依赖GDB调试,我们完全可能稍加改动就实现针对其他同样支持GDB的平台(如Linux和Raspberry Pi)做代码调试。在这篇博客中我将会分享在Linux,Raspberry Pi上远程调试C++代码的步骤。

 因为这套方法是我在最初专门为Android设计的实施上修改得来,它有一定的局限性,但是它显示了这项功能的潜力。这是我们为什么对GDB实施开源的一个很好的例子。还请注意这不是一个交叉编译方案。您需要在Visual Studio中编辑源码,再拿到Linux机器去编译。一旦配置好了之后,您就可以触发断点以及逐行调试源代码,除了对SSH连接做正确的设置以外不需要其他附加工作。

以下是步骤

  1. 下载Visual Studio 2015 RC。安装类型中,选择自定义安装,并且选中交叉平台手机开发下面的Visual C++手机开发。
  2. Putty下载站点中下载plink,putty,pscp和puttygen。
  3. 设置SSH连接到您的Linux安装使用证书身份验证。关于此项的一个不错的概览是在Azure上链接Linux的SSH使用指南。这些指南总体上足够涵盖从Windows连接到任何Linux机器,而不仅仅是那些运行Azure的机器。
  4. 通过Putty从您的Windows机器连接到Linux机器。系统将提示您的服务器主机密钥不在注册表中。选择yes以将其添加到注册表以使得主机受信。如果您不这样做,您将在后面得到一个错误提示,但它并不能清晰地指明问题所在。
  5. 您需调试的代码要放在本地机的C++ Makefile 工程项目里。
  6. 您将需要创建一个xml配置文件用来指定plink在哪儿,您的连接信息,在远程机器上的exe文件地址以启动GDB。以下是一个示例。 

<PipeLaunchOptions xmlns="https://schemas.microsoft.com/vstudio/MDDDebuggerOptions/2014"
PipePath="plink.exe" PipeArguments="-i private.ppk user@server -batch -t gdb --interpreter=mi"
ExePath="/home/user/YourDir/exe" ExeArguments=""
TargetArchitecture="X64" WorkingDirectory="/home/user/YourDir" AdditionalSOLibSearchPath="">
</PipeLaunchOptions>

       7. 打开命令提示符窗口,在Visual Studio菜单中选择视图->其他窗口->命令提示符窗口。

       8. 通过以下命令传递您的配置文件:

           Debug.GDBLaunch /OptionsFile:[path] /Executable:foo

       9. 享受在Linux上用VS2015远程调试您的C++程序吧!

如果您想让事情更加简单,在第5步您可以在Makefile项目中指定以下命令为构建命令。

  • 远程复制您的文件:

            pscp.exe -i private.ppk -r YourDir user@server:/home/user

  • 远程编译:

         plink.exe user@server -i private.ppk "cd ~/YourDir; g++ -g yourcode.cpp -o yourexecutable"

鉴于我上述的仅仅是对未来的预览,以下是一些已知问题:

  • 在开始以上的第8步后你将遇到一个错误信息,“无定义命令gdb”。一旦连接建立,我们的调试引擎试图开始gdb,但是我们已经通过配置文件参数开始了调试。如果我们不是以这样的方式开始,就不能正确建立起到GDB的连接,并且将孤立的gdb进程遗留在目的机上。
  • 即使您在上面建立断点,进入Main函数后的第一个代码语句总会错过。
  • 无需输入可执行文件的执行参数,因为执行参数应该已经包含在选项文件中了,所以即使输入也不会被使用。
  • 由于不支持交叉编译您需要把您的工具链和gdb安装在Linux目标机上。

如果您感觉这篇博客很有用或者您在使用中遇到任何问题,请在下面评论让我们知道。我们也欢迎任何有助于提升的建议。