应用调试(二)GDB



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.gzcd gdb-7.6/# 忽略这种函数命名不规范导致的错误./configure --target=arm-linux --disable-werrormakemkdir tmp make install prefix=$PWD/tmpsudo cp tmp/bin/arm-linux-gdb  /usr/bin# arm-linux-gdb -vGNU 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-gnubuild_vendor=unknownbuild_os=linux-gnubuild=x86_64-unknown-linux-gnuhost_alias=x86_64-unknown-linux-gnuhost_vendor=unknownhost_os=linux-gnuhost=x86_64-unknown-linux-gnutarget_alias=arm-linuxtarget_vendor=unknowntarget_os=linux-gnutarget=arm-unknown-linux-gnu

编译单板GDBserver

命令如下

cd gdb/gdbserver/./configure  --host=arm-linuxmake# 这里需要修改 vi linux-arm-low.cmake

#因为这gdbserver是要放在开发板上的,就不用make install了

#查看下生成的文件[email protected]:~/stu/gdb/gdb-7.6/gdb/gdbserver$ file gdbservergdbserver: 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/bincd /opt/gcc-3.4.5-glibc-2.3.6/
    
    #搜索宏  PTRACE_GETSIGINFO[email protected]:/opt/gcc-3.4.5-glibc-2.3.6
     grep "PTRACE_GETSIGINFO" * -nRarm-linux/include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO   0x4202arm-linux/sys-include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO       0x4202distributed/arm-linux/include/linux/ptrace.h:27:#define PTRACE_GETSIGINFO       0x4202distributed/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:66               *p = 0x12;

CoreDump

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

ulimit -c unlimited# ./testa = 0x12Segmentation fault (core dumped)

# 复制这个 core 文件去主机# 我们这里本身就在主机nfs上

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

[email protected]:~/stu/code$ sudo chmod 777  core[email protected]:~/stu/code$ arm-linux-gdb ./test coreGNU gdb (GDB) 7.6Copyright (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:66               *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.oldcd /usr/local/gdb8/binsudo 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;}

原文地址:https://www.cnblogs.com/zongzi10010/p/10291525.html

时间: 2024-08-28 21:29:34

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

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

linux-c/c++调试利器gdb.ddd小试 原文链接: http://deepfuture.iteye.com/blog/749148 博客分类: C++/C/lisp CC++C#LinuxUbuntu 一.gdb,在shell窗口调试 main.c内容: main.c #include <stdio.h> int main() { int y=0; for (int i=0;i<10;i++){ y+=i; } return 0; } 深未来技术原创文章,如转载,请注明来源ht

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

http://www.cnblogs.com/xd502djj/archive/2012/08/30/2663960.html linux下的c/c++调试器gdb gdbLinux 包含了一个叫 gdb 的 GNU 调试程序. gdb 是一个用来调试 C 和 C++ 程序的强力调试器. 它使你能在程序运行时观察程序的内部结构和内存的使用情况. 以下是 gdb 所提供的一些功能: * 设置断点:* 监视程序变量的值:* 程序的单步执行:* 修改变量的值.       gdb支持下列语言C, C+

调试利器GDB(上)

调试利器GDB(上) 1.1 GDB初识 1.1.1什么是GDB? GDB是GNU项目中的调试器(gnu debuger),能够跟尊程序的执行,也能恢复程序崩溃前的状态 1.1.2为什么需要GDB? 软件产品的研发过程必然伴随bug,调试时软件开发中不可或缺的技术(调试工具很重要) 1.1.3 DBG与binutils 1.2 GDB的常规使用 1.自定义程序得到启动方式(指定影响程序运行的参数)2.设置条件断点(在满足条件时程序暂停执行)3.回溯检查导致程序异常结束的原因(core dump)

调试利器GDB(下)

调试利器GDB(下) 2.1数据断点 GDB中支持数据断点的设置,watch命令用于监视变量是否被改变(本质为硬件断点)用法:watch var_name 2.2 GDB中的内存查看 GDB中可以查看任意内存区域中的数据,命令格式:x /Nuf expressionN -需要打印的单元数u -每个单元的大小f -打印数据的格式其数据格式如下: 2.3 GDB中的打印格式 实例:判断系统大小端 2.4函数调用栈查看 backtrace,查看函数调用的顺序(函数调用栈的信息)frame N 切换到栈

GDB调试 (二)

GDB的命令概貌------- 启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示: /home/hchen> gdb    GNU gdb 5.1.1    Copyright 2002 Free Software Foundation, Inc.    GDB is free software, covered by the GNU General Public License, and you are    w

gcc gdb调试 (二)

GDB的命令概貌——————— 启动gdb后,就你被带入gdb的调试环境中,就可以使用gdb的命令开始调试程序了,gdb的命令可以使用help命令来查看,如下所示: /home/hchen> gdb    GNU gdb 5.1.1    Copyright 2002 Free Software Foundation, Inc.    GDB is free software, covered by the GNU General Public License, and you are    w

linux 下C/C++程序常用调试方法(gdb)

 不管是在开发或者运行过程中,调试保证程序正常运行最基本的手段,熟悉这些调试方式,方便我们更快的定位程序问题所在,提高开发效率. 一 程序正常运行调试 (1)  直接使用gdb 开发过程中最常用的方式,我们可以在其过程中给程序添加断点,监视等辅助手段,监控其行为是否与我们设计相符,比如: (2)      程序已经运行,通过attach附加到进程 二 程序中断后调试 首先简单介绍下linux 下的信号: 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.进程之间可以互相通过

[iOS逆向实战 之十]动态调试利器---gdb基础篇

个人原创,转帖请注明来源:cnblogs.com/jailbreaker 一.调试平台搭建 1.GNU Debugger.首先安装ios下的gdb调试器,添加源:cydia.radare.org .搜索 GNU Debugger,安装之.(有些源的GDB好像不能用,这个测试没问题) 2.openSSH.这个应该都会装,没装过的参考,http://www.cnblogs.com/jailbreaker/p/4142609.html 3.adv-cmds.添加源:apt.saurik.com(这个应

关于iOS开发者账号功能总结-真机调试(二)

转载请注明出处:http://blog.csdn.net/dengbin9009/article/details/43970059 在上篇文章中说道如何从开发者网站创建App ID,添加Device,创建并下载开发证书,创建并下载配置文件,详情见:关于iOS开发者账号功能总结-真机调试(一). 在这篇文章中将要介绍的时如何利用下载号的证书cer文件和配置文件mobileprovision. 上篇文章我们已经将证书和配置文件下载到桌面,不过为了Mac的贞洁(笔者处女座),已经把两个文件放到特定的文