Gdbserver是一个运行在Linux上的调试工具,用于调试Linux上运行的应用程序。当目标系统是一个嵌入式系统时,可能因为资源的限制而不能运行全功能版本的gdb,这个时候gdbserver就显得格外的有用了。
Visual Studio Preview 1添加了一项新的特性:使用gdbserver对CMake工程进行远程调试。在之前的一篇文章中,我们描述了如何在Linux docker容器中编译CMake应用程序。在今天的文章中,我们将在前篇文章的基础上涵盖如下的内容:
2. 拷贝编译生成的文件到本机。
3. 部署生成的程序到另外一个独立的ARM linux系统(通过SSH进行连接),并借助ARM系统上的gdbserver和本机上的gdb来进行远程调试。
通过在本机上使用一个特定版本的gdb,可以避免在远程(嵌入式)系统上施一公全功能版本的gdb。
请注意,以上流程目前只是VS Preview 1中的一项实验特性,并需要一些手动的配置才能工作。
这篇文章假设你已经成功配置了VS2019并可以在一个Linux docker容器(Ubuntu)中编译一个CMake工程。如果你对这块还有点不明白,可以参考我之前的一篇文章。
为这个流程所进行的配置是比较通用的,也就是说,你可以在任何Linux环境(一台VM,或者一台远程Linux服务器等)来做相同的配置步骤。
第一件事,是需要修改我们的配置文件来进行ARM的交叉编译。在之前的文章中,我们创建了一个Dockerfile,我们基于这个Dockerfile做了如下的改动:
在以上的Dockerfile中,我使用apt-get来安装了一个交叉编译器并从本机拷贝了一个CMake配置文件到Docker容器中。CMakeCMake是一个需要安装的依赖项,但是从上一篇文章中我们可以通过部署一个静态链接的版本来解决这个依赖问题。
CMake工具链文件指定了有关编译器和相关工具的路径信息。我在这里使用了一个CMake的例子文件来在Windows上创建一个配置文件,其内容如下:
保存这个文件为”arm_toolchain.cmake”到Dockerfile所在的文件夹。另外,我们也可以通过在上面COPY命令中添加到此文件的相对路径。
至此,我们可以编译一个Docker映像并执行了。
最后,我们可以通过SSH来直接和Docker容器进行交互,并创建一个用户账号。请注意再次提醒,你可以在Dockerfile中启用root登录,这样可以避免所有的手动操作。只需要替换为你想要使用的用户账号即可,如下图所示:
这样,你就可以准备好从Visual Studio中进行编译了。
请注意,每次你修改以上配置,都需要记得删除配置文件的缓存版本(Project > CMake Cache (arm-Debug only) > Delete Cache)。如果你没有安装CMake,VS会提示你在远程机器上安装一个静态链接的版本,作为配置过程的一部分。
你的CMake工程已经完成配置,准备可以在Linux Docker容器中进行ARM交叉编译了。当你编译程序的时候,你将会在远程机器(/home//.vs/…)和本机上看到编译输出的文件。
接下来,我们将在连接管理器中创建一个新的远程连接。这个是我们将要部署的目标系统,其运行的是OS Raspbian (ARM)系统。请确保ssh正常运行在这个系统上。
WSL。而且它还不支持多个localhost连接。这个限制主要是因为一个bug,我们会在VS的下一个版本中得到修复。在这种情况下,你的Docker连接将会是唯一一个localhost连接,并且可以通过SSH来连接ARM系统。
我们将会手动的配置这个文件(包括添加或删除一些属性)来启用gdbserver调试。
以下是配置文件的一个例子,供参考。请注意,这项支持还比较新,仍然需要一些手动的配置步骤。
现在可以在程序中设置一个断点,并确保arm-Debug是当前激活的配置项,并且当前的调试器为gdbserver,如下图所示:
当按下F5时,工程将会在CMakeSettings.json中配置的远程系统上开始编译,并部署到launch.vs.json中指定的系统中。同时,本机调试会话也将会启动。
1. 如果launch配置没有正确配置,那么你将可能不能连接远程机器。所以,请确保清除掉你将要部署的系统上的所有gdbserver进程。
2. 如果你没有修改CMake配置中的remote build root,则在远程系统上的程序的相对路径将和远程编译环境中的相对路径一致。
所以说:编译,部署,调试,一切的一切,Visual Studio都给安排的明明白白了?
|