gdb使用

Posted 叮咚咕噜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gdb使用相关的知识,希望对你有一定的参考价值。

前言

  • 在工作中,无论是学习代码流程还是问题的定位,GDB都显得尤为重要,多掌握一些命令可以提升我们的效率和解决问题的能力;
  • 按照我的理解,对GDB的掌握程度可以分为三种人:
    • 基础命令,大家都知道
    • 相对高阶一点的,少数人了解,掌握之后可以提升调试解决问题的效率
    • 需要结合反汇编、栈回溯、malloc内存分配原理和结构、elf文件结构等知道,配合GDB来解决一些内存相关的偶现问题

本文主要是对前面两部分内存进行描述,最后部分会在其他专题展开描述。

1、GDB基础介绍

1.1简介

  • gdb是GNU开源组织发布的一个强大的Linux下的程序调试工具
  • gdb除支持c/c++语言外还支持go、D、object-c、fortran等语言
  • GDB主要帮助你完成下面四个方面的功能:
    • 启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
    • 可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
    • 当程序被停住时,可以检查此时你的程序中所发生的事。
    • 你可以改变你的程序,将一个BUG产生的影响修正从而测试其他BUG。

1.2编译

这块不是我们的重点,而且网上资料很多,不做展开

2、GDB的使用

2.1使用方式

2.1.1本地调试

直接在服务器或者当前嵌入式设备环境下运行,如果gdb程序为gdb,应用程序为build,则运行调试使用命令如下:

~#gdb ./build

2.1.2远程调试

远程调试需要两个GDB程序,运行在远程设备(target)上的程序称之为gdbserver,运行在本地主机host上的gdb程序为交叉编译器,即在x86平台上运行arm平台的gdb程序,记作gdb_client
1、嵌入式设备执行:

~#./gdbserver 192.168.10.2:1234 ./build

其中192.168.10.2表示允许从这个IP地址登录道嵌入式设备,一般我们的PC服务器地址,也尅省略,表示允许从任何IP连入,:1234为端口号,build为即将调试的应用程序。
2、PC端执行:

~#arm-linux-gdb  ./build_Debug
   handle  SIGPIPE  SIGUSR2  SIG32 nostop noprint
   target remote 172.8.4.11:1234  //与服务端建立关联

其中172.8.4.11为当前嵌入式设备的IP地址,:1234位端口,必须与嵌入式设备运行时指定的端口一直,两者均为必填项,不能省略。
注:

  1. 设备端无需输入build_Debug ,否则加载会非常慢
  2. 由于设备端内存等的原因,一般情况下我们都是使用远程调试

2.1.3attach

在实际的交叉编译开发过程中,在某些时候我们运行程序时没有加载gdb,但是却发现了一个偶现问题,需要gdb来定位,这个时候就需要去attach分析。
1、找到当前可执行程序对应的debug版本
2、ps,查看当前可执行程序的进程号
3、设备端执行

./gdbserver 192.168.10.2:1234 --attach 669 (669是进程pid)

4、PC端:

~#arm-linux-gdb  ./build_Debug
   handle  SIGPIPE  SIGUSR2  SIG32 nostop noprint
   target remote 172.8.4.11:1234

5、detach可退出gdb(退出之后程序正常运行)

2.1.4core分析

core文件是死机之后为了还原现场进行分析而生成的,后面会详细介绍,这里只是介绍一下core文件的解析:

~#arm-linux-gdb  ./build_debug ./core.669 

加载成功之后,可以直接bt查看到当前死机的线程,对core文件进行分析。
注:

  1. core生成的可执行程序要和core解析时使用的debug版本的可执行程序对应,否则会解析异常
  2. core加载有很多问号,需要指定一下动态库的路径
set solib-search-path ./libso/
set solib-absolute ./libso/

以上是关于gdb使用的主要内容,如果未能解决你的问题,请参考以下文章

代码调试篇:如何编写 gdb 自定义命令

代码调试篇:如何编写 gdb 自定义命令

使用GNU/gdb调试Linux C/C++可执行程序查看出错源代码、设置断点

GDB调试

gdb调试中怎么查看其中一行的汇编代码

GDB调试汇编分析