arm-linux的gdb调试技巧

此文档主要演示了如何使用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、查看内存

编写评论...
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值