arm gdb命令 linux

2015-11-30 21:31:08 qq_21792169 阅读数 18850
  • Linux系统安装

    1.linux开发系统安装配置 2.shell命令 3.VI编辑器 4.GCC/GDB 5.Makefile 6.ARM开发板说明 7.嵌入式交叉开发环境

    5985人学习 沈寒
    免费试看


在PC机下调试PC机程序:

gcc -g hello.c -o hello  @-o Specified Specified exec name -g debugging message 
gdb hello   @debugging program
break orr b params        @set breakpoint
b  function name
b line numbers
b file name + line numbers
b line numbers + if condition is  true 
 
run            @run program 


print + variable name  @display  variable value 
info  break orr b    @display all breakpoint numbers
delete breakpoint numbers  @delete the numbers breakpoint  
list orr l     @display  source code
next           @step by step running ,don't Entry sub function
step           @step by step running ,Entry sub function
continue orr c @high speed run as next breakpoint orr program end
finish       @running program utile Current function end
watch + variable value  @for the variable control 
q              @exit 


在开发板上调试交叉编译下的程序:在远程下调试。

1、Download GDB source code

website:ftp://ftp.gnu.org/gnu/gdb


2、compile GDB

# tar -xzvf gdb-7.4.tar.gz 

# cd gdb-7.4

# ./configure --target=arm-linux

#make

# mkdir tmp
# make install prefix=$PWD/tmp

#cp arm-linux-gdb  /bin


3、install board gdbserver:

#cd gdb/gdbserver/

#./configure --host=arm-linux

#make   (把生成的gdbserver复制到board的/bin目录下)


编译要调试的应用,编译时加上-g选项

 

4、cross compile gdbserver :


 5、debug

Board ip    = 210.41.141.111

Host pc ip = 210.41.141.155

 

Board:

#gdbserver 210.41.141.111:1111 ./test_debug      /*1111为端口号,可以随便设置*/

 

host pc:

(由于交叉编译自带gdb工具,所以这里要指定路径,不然会冲突)

#/bin/arm-linux-gdb   ./test_debug

(gdb)target remote 210.41.141.111:1111


....

链接成功后,gdb远程调试和gdb本地调试方法命令相同。


2019-08-07 10:45:25 weixin_39878023 阅读数 303
  • Linux系统安装

    1.linux开发系统安装配置 2.shell命令 3.VI编辑器 4.GCC/GDB 5.Makefile 6.ARM开发板说明 7.嵌入式交叉开发环境

    5985人学习 沈寒
    免费试看

Linux调试之(二)gdb+vmlinux

运行linux内核,难免会遇到oops崩溃问题,如类似空指针crash,系统crash时会打印一些当时的栈信息,我们可以通过这些信息结合vmlinux来调试具体在哪个函数上出现了问题。gdb可以运行代码进行调试,可以看到更多的panic附近的信息,但对于偶发的panic就不起作用了


本平台为RK3399:

【1】定位arm-eabi-gdb 和 vmlinux

  find ./ -type f -name '*' | xargs grep  'arm-eabi-gdb'
  find ./ -type f -name '*' | xargs grep  'vmlinux'

【2】gdb加载内核符号表

1.查看内核符号表

Vmlinux是一个elf内核符号表,编译进内核的函数列表之类的可以从里面提取出来
 readelf  -a vmlinux

访问elf文件所在目录,执行“readelf -a 文件名”即可查看elf文件的内容。
-a选项表示显示所有信息。

2.执行arm-eabi-gdb vmlinux

记得需在内核的.config里面要打开 DEBUG_INFO和DEBUG_VM

./prebuilts/gcc/linux-x86/arm/arm-eabi-4.8/bin/arm-eabi-gdb kernel/vmlinux

3.输入 list*(函数名+函数内偏移) 即可查看特定位置的代码,定位问题。

lst*dwc3_send_gadget_ep_cmd+0x108/0x3a8
[09:33:ed+0x24/0x28

(gdb) l * qrd7627a_add_io_devices+0x100
 0xc07cd05c is in qrd7627a_add_io_devices (/home/yejialong/GH700C/kernel/arch/arm/mach-msm/msm8x25/goso-msm7627a-io.c:1851).
 1846            } else if (machine_is_msm8625q_skud() || machine_is_msm8625q_evbd()) {
 1847        #ifndef CONFIG_CALA02
 1848             platform_device_register(&pmic_mpp_leds_pdev_skud);
 1849        #endif
 1850            /* enable the skud flash and torch by gpio leds driver */
 1851             platform_device_register(&gpio_flash_skud);
 1852        } else if (machine_is_msm8625q_skue()){
1853            /* enable the skue flashlight by gpio leds driver */
1854             platform_device_register(&gpio_flash_skue);
1855        }

【3】gdb调试基本命令

https://www.cnblogs.com/yjf512/p/9204520.html
启动项目并断点
start
打临时断点
tb
打断点
b
列出代码
l
单步运行
n
进入函数调试
step
跳出函数
finish
继续运行
c
查看断点信息
info b
去掉某个断点
delete
fork的时候进入子进程
set follow-fork-mode child
fork的时候进入父进程
set follow-fork-mode parent
2019-11-06 18:31:22 skytering 阅读数 49
  • Linux系统安装

    1.linux开发系统安装配置 2.shell命令 3.VI编辑器 4.GCC/GDB 5.Makefile 6.ARM开发板说明 7.嵌入式交叉开发环境

    5985人学习 沈寒
    免费试看

windows端 调试linux/arm linux上运行的应用

linux/arm linux端上打开gdbserver:
gdbserver localhost:[端口,如2001] [程序路径] [参数]

windows pc端:
arm-none-linux-gnueabi-gdb -q swd
target remote [目标平台IP地址]:[端口,如2001]

ubuntu pc端:
arm-oe-linux-gnueabi-gdb -q swd
target remote [目标平台IP地址]:[端口,如2001]

linux/arm linux端直接调试

arm端调试
一种:gdb [程序路径] 后 程序运行参数。
set args 可指定运行时参数。(如:set args 10 20 30 40 50)
show args 命令可以查看设置好的运行参数。

或者:
gdb --args [程序路径] [参数]

gdb相关命令

r
开始运行程序
c
继续程序的运行,直到遇到下一个断点
f
查看栈帧
bt
产看函数调用信息(堆栈)
q
退出GDB环境
i
描述程序的状态
l
显示多行源代码

2017-01-08 18:50:28 doumeile1 阅读数 737
  • Linux系统安装

    1.linux开发系统安装配置 2.shell命令 3.VI编辑器 4.GCC/GDB 5.Makefile 6.ARM开发板说明 7.嵌入式交叉开发环境

    5985人学习 沈寒
    免费试看
注:arm-linux-gdb的安装路径是/usr/local/arm/3.4.1
1、arm-linux-gdb的编译安装
下载gdb-6.8.tar.bz2至工作目录
gdb源码下载:http://ftp.gnu.org/gnu/gdb/
命令如下:
$tar -jxvf gdb-6.8.tar.bz2
$cd gdb-6.8
$./configure --target=arm-linux --enable-sim --prefix=/usr/local/arm/3.4.1
--prefix用于指定安装路径
$make
make时遇到以下错误:
configure: error: no termcap library found
make[1]: *** [configure-gdb] Error 1
make[1]: Leaving directory `/home/lining/gdb-6.8'
make: *** [all] Error 2
解决方法:主要是缺少termcap库文件,在终端里执行sudo apt-get install libncurses5-dev安装

$sudo make install
完成后可以在/usr/local/arm/3.4.1/bin下找到arm-linux-gdb文件
2、arm-linux-gdbserver的编译安装
进入./gdb/gdbserver
命令如下:
$cd gdb/gdbserver./configure --target=arm-linux --host=arm-linux 
$make CC=arm-linux-gcc
(CC=arm-linux-gcc用于指定arm-linux编译器)
编译时出现PATH_MAX undeclared错误的解决方法:
在hostio.c文件中增加
#include <linux/limits.h>
原因是宏PATH_MAX在<limits.h>中没有定义,而是定义在<linux/limits.h>中
(红色表示我在编译时没有碰到这个错误,此错误是网友整理的,留在这里以供以后参考)

编译成功后在当前目录下会生成gdbserver文件,拷贝至开发板上(可放入开发板/usr/bin/目录下,这样在任何目录下均可执行gdbserver命令)
2018-01-23 20:58:19 veson258 阅读数 784
  • Linux系统安装

    1.linux开发系统安装配置 2.shell命令 3.VI编辑器 4.GCC/GDB 5.Makefile 6.ARM开发板说明 7.嵌入式交叉开发环境

    5985人学习 沈寒
    免费试看

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

编写评论...

ARM使用GDB调试

阅读数 95

编译arm-linux-gdb

阅读数 1603

安装arm-linux-gdb

阅读数 1231