此文档主要演示了如何使用visual studio 2017开发Linux项目,并使用远程gdb调试
NOTE:前提条件为vs所在PC机与Linux server可互通,Linux server与板子可互通
方式一:
step 1:首先启动vs_Community.exe,下载visual studio 2017 for Linux
然后勾选使用C++的Linux开发,其他平台工具根据需求勾选
step 2:安装完毕后启动visual studio 2017
点击 文件->新建->项目
点击 已安装 -> 模板 -> Visual C++ -> 跨平台 -> Linux -> 生成文件项目,并在下方命名项目
NOTE: 上方我选择的框架是.NET 4.5,如果没有最好安装一个,用低版本.NET是未知结果的
创建好项目后,右键点击项目,通过添加新建筛选器和现有项,把源码加入到工程中
也可以不管目录结构,把所有的源码都添加进项目,对于编译和调试没有影响
step 3:设置编译参数
右键点击项目 -> 属性,在Debug配置,x64平台中,点击配置属性 -> 常规
设置配置类型,这里我们选择生成应用程序,然后应用(只有设置成应用程序才可以进行后面的配置)
然后配置调试器,target remote后面跟的参数是arm-linux平台地址和gdbserver监听端口(根据自己的不同需求,对应修改)
设置编译器参数C/C++编译器最好写成绝对路径,调试信息和警告等级可以根据需求修改,对应Makefile中的CFALGS
设置语言标准,通常来说,使用默认即可,有些高版本的语言版本,编译器是不支持的,比如C++11
预处理器可以添加类似于Makefile中的宏定义
配置包含目录,指定头文件的路径
配置链接器,使用交叉编译工具链中的g++即可
编译时,vs会把源码copy到linux server的~/projects/${project_name}下,但由于不会把库文件copy过去,所以我们要把依赖的库文件单独放在一个路径下。
NOTE:修改~/.bashrc中的alias,把arm-none-linux-gnueabi-gdb的别名设置为gdb,否则vs是找不到交叉编译调试器的
NOTE:不可以把库文件放到demo_show的下级目录,因为vs在clean project时,会把demo_show以及下级目录的所有文件清理掉
然后再次配置链接器,在附加库目录(即-L参数,共享库搜索路径即-rpath-link参数,-L/-rpath-link/-rpath三者有何不同详见百度)配置依赖库的路径(最好写成绝对路径),中间以分号分割
配置依赖库
NOTE:只需要填lib和.a/.so中间的名字,例如libpthread.so,只需填pthread,并且中间以分号分割
step 4:开始编译
右键点击项目 -> 生成,此时会要求输入远程调试参数,点击连接后,即通过ssh访问Linux server,连接参数会保存在vs中,可通过工具 -> 选项 -> 跨平台 -> 连接管理器修改
紧接着就可以在vs的输出窗口中看到编译信息,编译成功后,我们就可以开始调试了
step 5:使用gdb和gdbserver远程调试
首先在main函数入口设置一个断点
然后设置板子ip,使板子与Linux server互通
ifconfig eth0 192.168.250.67 NOTE:板子的地址要与之前在vs上配置的一致
route add default gw 192.168.250.1
使用mount命令把板子挂载到Linxu server上
NOTE:我使用的是release的系统
mount -t nfs -o nolock 192.168.251.66:/home/lzz/projects /mnt
由于已经提前在/home/lzz/projects路径下放置了gdbserver
使用板子进入/mnt目录(即PC的/home/lzz/projects目录)
执行./gdbserver :2345 ./demo_show/bin/x64/Debug/demo_show.out &
出现如下打印,说明gdbserver已经正常监听
NOTE:gdbserver后面的端口号要与vs上配置的一致
最后点击vs上方的远程GDB调试
后续调试方法与其他平台(.e.g wince)类似,可单步,设置断点条件,查看变量值等等。
方式二:
使用Makefile和shell的方式编译并调试
NOTE:如果使用这种方式,必须在Makefile中指定-g2参数,否则无法远程调试。
首先把写好的Makefile文件放置到工程的根目录中,然后把常规的配置类型修改为生成文件,点击应用
由于vs默认的路径是linux下的~路径,所以在生成命令行cd到指定工程路径,并且执行make,路径相关也可以通过修改vs的宏来设置。
在调试器配置界面中,把程序选项配置为生成的可执行文件
最后即可按照之前的方法来对程序进行调试。
小技巧:
1、可以在配置属性→调试→程序,指定调试时执行的可执行文件
2、当源文件存放在服务器上,而不需要从本机PC拷贝到服务器上时,可以在配置属性→ 复制源→ 复制源 选择否
3、当需要从本机PC拷贝源码到服务器上时,可以在配置属性→ 常规→ 远程生成根目录 指定自定义的文件路径
4、当需要从本机PC拷贝非源码,比如库文件时,可以在配置属性→ 复制源 中配置
5、之前存在收到系统信号时,gdb会执行中断,比如收到SIGUSR1,gdb默认的行为会中断,我们可以通过配置gdb达到忽略的目的。
gdb命令:handle SIGUSR1 SIGUSR2 nostop pass noprint
6、由于vs上配置的gdb执行命令只有一条,我们可以通过gdb的配置文件来达到忽略信号,和远程调试命令的结合
gdb在执行时,会在当前用户目录下,寻找.gdbinit文件,如果文件存在,则载入文件中的命令
example:
define lzz
handle SIGUSR1 SIGUSR2 nostop pass noprint
target remote 192.168.250.135:2345
end
define 后面是自定义的命令名,每一行执行一个gdb命令,以end结尾
那么我们在填写配置属性→ 调试→ 其他调试程序命令 时,填写lzz,即可通过lzz命令执行文件中的gdb命令
调试示例:
1、实时查看堆栈信息
2、设置条件断点
3、逐语句执行时拖动箭头改变程序执行顺序
4、反汇编并且可以单步执行汇编代码
5、改变指定变量的值
6、查看调用结构
7、速览定义
8、重命名
9、并行堆栈
10、查看寄存器
11、查看内存