title: 应用调试(二)GDB
date: 2019/1/17 21:00:10

toc: true

应用调试(二)GDB

gdb下载工具安装交叉工具链设置GDB介绍编译GDBtarget/host/build编译主机GDB编译单板GDBserver调试程序CoreDumpGDB命令杂项附录源码

gdb下载

官网

这里我下载了gdb-7.6.tar.gz编译成功,下载了8.x的需要c++11,后来没有试了

里面的".sig"为文件名的分离签名文件,用来校验下载资源的完整性,.xz为另外格式的压缩包

工具安装

# 高版本的gdb需要这个东西
sudo apt-get install texinfo

交叉工具链设置

  • --program-prefix=arm-linux-是指生成的可执行文件的前缀,比如arm-linux-gdb
  • -prefix是指生成的可执行文件安装在哪个目录
  • 可以指定工具连 make CC=arm-none-linux-gnueabi-gcc https://blog.csdn.net/hanq4998/article/details/84675718

GDB介绍

GDB调试分为两个部分

  • 单板运行gdbserver,作为主进程,他来创建所调试程序为子进程,使用系统调用ptrace跟踪
  • 主机运行arm-linux-gdb,调试远程的单板程序

mark

编译GDB

target/host/build

这里的这些其实就是编译工具的指定

  • build
  • host 编译出来的程序在哪里运行,其实就是编译工具
  • target 这个选项一般为编译器所拥有,一般的程序不需要,意思是编译出来的编译器它编译的东西在哪里运行

mark

编译主机GDB

具体流程如下

tar xzf gdb-7.6.tar.gz
cd gdb-7.6/
# 忽略这种函数命名不规范导致的错误
./configure --target=arm-linux --disable-werror
make
mkdir tmp 
make install prefix=$PWD/tmp
sudo cp tmp/bin/arm-linux-gdb  /usr/bin
# arm-linux-gdb -v
GNU gdb (GDB) 7.6

一些注意点

  • 编译出的运行在ubuntu下的GDB需要调试arm下的程序,这里需要指定target=arm-linux

  • --disable-werror 是百度到的,不然接下去make失败

  • 使用arm-linux-gcc version 3.4.5编译

  • 先安装到当前目录的tmp下,可以通过生成的Makefie看到默认的路径是usr/local

    build_alias=x86_64-unknown-linux-gnu
    build_vendor=unknown
    build_os=linux-gnu
    build=x86_64-unknown-linux-gnu
    host_alias=x86_64-unknown-linux-gnu
    host_vendor=unknown
    host_os=linux-gnu
    host=x86_64-unknown-linux-gnu
    target_alias=arm-linux
    target_vendor=unknown
    target_os=linux-gnu
    target=arm-unknown-linux-gnu

编译单板GDBserver

命令如下

cd gdb/gdbserver/
./configure  --host=arm-linux
make
# 这里需要修改 vi linux-arm-low.c
make #因为这gdbserver是要放在开发板上的,就不用make install了 #查看下生成的文件
book@100ask:~/stu/gdb/gdb-7.6/gdb/gdbserver$ file gdbserver
gdbserver: ELF 32-bit LSB executable, ARM, version 1, dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.4.3, not stripped
# 复制到单板
cp gdbserver ~/stu/code
  • gdbserver调试的程序是运行在arm下的,也就是指定host,这里应该不需要指定host,我测试了一下,生成的执行文件crc一致

  • 修该代码,这里make会有如下错误提示找不到宏定义,我们需要去交叉编译工具链的目录去搜索

    linux-arm-low.c: In function arm_stopped_by_watchpoint':
    linux-arm-low.c:643: error:
    PTRACE_GETSIGINFO' undeclared (first use in this function) # 查看环境变量
    echo 
    不能识别此Latex公式:
    PATH
    /home/book/bin:/home/book/.local/bin:/opt/slickedit-pro2017/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/opt/gcc-3.4.5-glibc-2.3.6/bin:/snap/bin
    cd /opt/gcc-3.4.5-glibc-2.3.6/ #搜索宏  PTRACE_GETSIGINFO
    book@100ask:/opt/gcc-3.4.5-glibc-2.3.6
     grep "PTRACE_GETSIGINFO" * -nR
    arm-linux/include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO   0x4202
    arm-linux/sys-include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO       0x4202
    distributed/arm-linux/include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO       0x4202
    distributed/arm-linux/sys-include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO   0x4202 # 修改代码 加入 #include<linux/ptrace.h>
    vi linux-arm-low.c

调试程序

  1. 编译程序,加入-g选项,形如arm-linux-gcc -g -o test test.c

  2. 单板开启gdbserver,命令形如gdbserver 192.168.95.2345 ./test,这IP是单板的IP,端口随意

  3. 主机远程连接到单板

    arm-linux-gdb ./test
        target remote 192.168.95.222:2345
  4. 接下去就可以调试了,注意这里打断点到哪一行,该行并未执行,这和我们ide是一样的,并且使用step等命令显示的下一句c代码,实际上也是没有执行的

    mark

  5. 我们这个程序故意引入空指针,所以最后会有错误提示

    Program received signal SIGSEGV, Segmentation fault.
    0x000084ac in C (p=0x0) at test.c:6
    6               *p = 0x12;

CoreDump

这个类似一个日志文件,首先需要在单板上开启这个功能

ulimit -c unlimited
# ./test
a = 0x12
Segmentation fault (core dumped) # 复制这个 core 文件去主机
# 我们这里本身就在主机nfs上

直接使用这个文件在主机上运行,这里可能需要加权限,直接chmod 777 core

book@100ask:~/stu/code$ sudo chmod 777  core
book@100ask:~/stu/code$ arm-linux-gdb ./test core
GNU gdb (GDB) 7.6
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "--host=x86_64-unknown-linux-gnu --target=arm-linux".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/book/stu/code/test...done.
[New LWP 812] warning: `/lib/ld-linux.so.2': Shared library architecture unknown is not compatible with target architecture arm. warning: Could not load shared library symbols for /lib/libc.so.6.
Do you need "set solib-search-path" or "set sysroot"?
Core was generated by `./test'.
Program terminated with signal 11, Segmentation fault.
#0  0x000084ac in C (p=0x0) at test.c:6
6               *p = 0x12;

可以看到出错的地方

直接使用命令bt查看调用树

(gdb) bt
#0  0x000084ac in C (p=0x0) at test.c:6
#1  0x000084d0 in B (p=0x0) at test.c:12
#2  0x000084f0 in A (p=0x0) at test.c:17
#3  0x0000856c in main (argc=1, argv=0xbedb6ed4) at test.c:38

GDB命令

http://www.cnblogs.com/veryStrong/p/6240775.html

http://blog.sciencenet.cn/blog-619295-813770.html

名称 命令 描述
断点 break main  
  break test.c:20 在test.c的20行 中间不能有空格
继续 c continue
单步进入 step 进入函数
单步跳过 next 不会进入函数
打印变量 print a 打印a变量

杂项

FAQ

这里我试了在编译gdb的时候,最后安装的时候出现gdb.info出错,但实际上arm-linux-gdb已经生成了,好像是可以用的了

一些命令

#查看文件属性
file gdbserver #链接文件
sudo mv ./gdb ./gdb.old
cd /usr/local/gdb8/bin
sudo ln -s $(pwd)/gdb /usr/bin/gdb

附录源码

#include <stdio.h>

void C(int *p)
{
    *p = 0x12;
} void B(int *p)
{
    C(p);
} void A(int *p)
{
    B(p);
} void A2(int *p)
{
    C(p);
} int main(int argc, char **argv)
{
    int a;
    int *p = NULL;     A2(&a);  // A2 > C
    printf("a = 0x%x\n", a);   printf("step1");
  printf("step2");
  printf("step3");     A(p);    // A > B > C     return 0;
}

应用调试(二)GDB的更多相关文章

  1. linux-c/c++调试利器gdb、ddd小试

    linux-c/c++调试利器gdb.ddd小试 原文链接: http://deepfuture.iteye.com/blog/749148 博客分类: C++/C/lisp CC++C#LinuxU ...

  2. [转] linux下的c/c++调试器gdb

    PS:1. 断点C++类函数,用b 命名空间::类名::方法名 2. 编译参数一定要加-g,才可断点调试 http://www.cnblogs.com/xd502djj/archive/2012/08 ...

  3. linux下的c/c++调试器gdb

    Reference:  http://www.cnblogs.com/xd502djj/archive/2012/08/30/2663960.html linux下的c/c++调试器gdb gdbLi ...

  4. gcc gdb调试 (二)

    GDB的命令概貌——————— 启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示: /home/hchen> g ...

  5. 一文入门Linux下gdb调试(二)

    作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的 ...

  6. 调试利器GDB(上)

    什么是GDB: GDB应用: 静态分析工具与动态分析工具: GDB启动方式: GDB启动之后会有一个交互式的命令行,可以输入GDB特定的命令让GDB去工作. gdb test.out意思是这一次gdb ...

  7. 40.Linux应用调试-使用gdb和gdbserver

    1.gdb和gdbserver调试原理 通过linux虚拟机里的gdb,来向开发板里的gdbserver发送命令,比如设置断点,运行setp等,然后开发板上的gdbserver收到命令后,便会执行应用 ...

  8. [转载] Fiddler为所欲为第二篇 像OD一样调试 [二]

    首先,如果大家没有看过第一篇,可以先看看第一篇,了解Fiddler script的脚本哦.传送门:https://www.52pojie.cn/thread-854434-1-1.html 导语:其实 ...

  9. 调试利器GDB(下)

    本节我们研究gdb更深层的用法: 数据断点: 可以根据变量的值来监视变量. 数据断点本质是硬件断点,数量有限. watch var_name告诉gdb我们关注var_name这个变量,如果它的值被改变 ...

随机推荐

  1. mssql sqlserver 指定特定值排在表前面

    转自:http://www.maomao365.com/?p=7141 摘要: 下文讲述sql脚本编写中,将 特定值排在最前面的方法分享, 实验环境:sqlserver 2008 R2 例:将数据表中 ...

  2. python_库学习_02_微信自动回复机器人

    一.python发展的趋势日益庞大,微信也有对应的库itchat.这次的实例做做成可在任意电脑运行的微信自动回复机器人exe.文件. 二.完成这个小应用我们需要装一些库,, itchat:这个东东不出 ...

  3. 雨后清风教你如何在Windows 7中对硬盘进行分区

    磁盘分区是将硬盘驱动器分成多个逻辑单元.人们通常不会选择对硬盘进行分区,但它有很多好处.主要是,通过对磁盘进行分区,您可以将操作系统与数据分开,从而减少数据损坏的可能性. 磁盘分区方法 打开“计算机管 ...

  4. LeetCode算法题-Design HashSet(Java实现)

    这是悦乐书的第298次更新,第317篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第166题(顺位题号是705).不使用任何内建的hash表库设计一个hash集合,应包含 ...

  5. 英语口语练习系列-C18-Wildest Dreams

    词汇复习 actor 演员 afternoon 下午 alive 活着的 apple 苹果 adjective 形容词 air 空气 animal 动物 April 四月 adult 成年人 airp ...

  6. 通过ip查询自己电脑的共享文件夹

    查看电脑所有的共享文件或文件夹的三种方法如下: 方法一. 右键点击网上邻居,点击属性进入网上邻居属性页面. 选中本地连接,在窗口的左下方有详细信息,可以看到内网IP,记住IP地址. 直接在地址栏输入记 ...

  7. Linux:Day12(下) 进程、任务计划

    vmstat命令: vmstat [options] [delay [ count]] procs: r:等待运行的进程的个数: b:处于不可中断睡眠态的进程个数:(被阻塞的队列的长度): memor ...

  8. Redis详解(三)------ redis的五大数据类型详细用法

    我们说 Redis 相对于 Memcache 等其他的缓存产品,有一个比较明显的优势就是 Redis 不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据 ...

  9. [JLOI2015]骗我呢

    [JLOI2015]骗我呢 Tags:题解 作业部落 评论地址 TAG:数学,DP 题意 骗你呢 求满足以下条件的\(n*m\)的矩阵的个数对\(10^9+7\)取模 对于矩阵中的第\(i\)行第\( ...

  10. 技术趋势:React vs Vue vs Angular

    React.Vue 和 Angular 这两年发展状况如何?2019 年哪个技术最值得学习? 前几天 Medium 上有一位作者发表了一篇关于 React.Vue 和 Angular 技术趋势的文章( ...