GDB 基本使用

2017-03-10 Friday     program

简介

在使用 gdb 时,需要通过 -g 参数把调试信息加到可执行文件中,否则没有函数名、变量名、代码地址,所代替的全是运行时的内存地址。

> cc -g hello.c -o hello
> g++ -g hello.cpp -o hello

gdb 详细使用方式可以通过 gdb --help 查看。

注意,gdb 在保证命令不冲突的前提下,提供了简写命令,例如 list 查看源码,实际上通过 l 也可以。

启动

常见的有如下几种启动方式。

----- 直接通过GDB启动进程
$ gdb <program>
----- 调试Core文件
$ gdb <program> core
----- Attach到正在运行的进程上,也可以进入gdb后执行attach命令
$ gdb <program> <PID>

另外一些启动时的常用参数为。

-symbols/-s <file>
   指定文件读取符号表。
-se file
   从指定文件中读取符号表信息,并把他用在可执行文件中。
-core/-c <file>
   调试Core文件。
-directory/-d <directory>
   加入一个源文件的搜索路径,默认是PATH指定的路径。

是否查找到源文件,可以通过 list/l 命令查看。

参数设置

在通过 r/run 正式运行前,可以通过如下方式设置运行参数、环境变量等信息。

----- 程序的运行参数设置、查看
(gdb) set args <arguments>

----- 查看设置好的运行参数
(gdb) show args

内存查看

也就是 examine 命令,通常简写为 x ,对应的命令格式为 x/nfu <ADDR>

* n 显示内存个数;
* f 显示方式;
  - x 按十六进制格式显示变量;
  - d 按十进制格式显示变量;
  - u 按十进制格式显示无符号整型;
  - o 按八进制格式显示变量;
  - t 按二进制格式显示变量;
  - a 按十六进制格式显示变量;
  - i 指令地址格式;
  - c 按字符格式显示变量;
  - f 按浮点数格式显示变量;
* u 一个地址单元的长度;
  - b 单字节;
  - h 双字节;
  - w 四字节;
  - g 八字节;

变量查看

----- 查看所有的全局和静态变量
(gdb) info variables
----- 当前栈的局部变量,包括了本函数中的静态变量
(gdb) info locals
----- 查看参数
(gdb) info args

多线程

先介绍一下GDB多线程调试的基本命令。

info threads                                 显示所有线程,通过星号标示当前线程
thread ID                                    切换当前调试的线程为指定ID的线程。
thread apply <all|ID1 ID2 ... IDn> <command> 指定多个线程执行命令
break <filename:lineno> thread all           在所有线程上设置断点
set scheduler-locking off|on|step

调试多线程时,如果使用 step 或者 continue 命令调试当前被调试线程,其他线程也是同时执行的,可以通过如上的参数进行设置,参数的含义为:

  • off 默认值,不锁定任何线程,也就是所有线程都执行;
  • on 只有当前被调试程序会执行;
  • step 在单步的时候,除了next过一个函数以外,只有当前线程会执行。

死锁查看

(gdb) info threads                # 可以查看那些线程在等锁
(gdb) thread apply all bt


如果喜欢这里的文章,而且又不差钱的话,欢迎打赏个早餐 ^_^


About This Blog

Recent Posts

Categories

Related Links

  • RTEMS
    RTEMS
  • GNU
  • Linux Kernel
  • Arduino

Search


This Site was built by Jin Yang, generated with Jekyll, and hosted on GitHub Pages
©2013-2019 – Jin Yang