Linux GDB使用总结


参考文献:

[1]《嵌入式Linux教程(上册)》

[2] Linux下gdb的安装及使用入门


1、GDB介绍

GBD(the GNU Project Debugger)是GNU发布的一个功能强大的UNIX程序调试工具,可以调试C、C++、Pascal等多种语言程序,可以在大多数UNIX和Microsoft windows变种上运行。GDB既可以本地调试也可以远程调试。

通过GDB能够对程序进行如下调试:

  • 运行程序,还可以给程序,还可以给程序加上某些参数,执行程序的行为;
  • 使程序在特定的条件下运行;
  • 检查程序停止时的运行状态;
  • 改变程序的参数,以纠正程序中的错误。

2、GDB基本命令

如果要使用GDB调试,在编译时候需要加上-g参数(在末尾加),例如:

gcc -o gdbtest gdbtest.c -g

编译成功后,使用gdb进行调试,开启命令:

gdb gdbtest

在GDB的命令提示符之后,输入help,可以查看GDB的命令分类。

(gdb) help
List of classes of commands:

aliases -- Aliases of other commands
breakpoints -- Making program stop at certain points
data -- Examining data
files -- Specifying and examining files
internals -- Maintenance commands
obscure -- Obscure features
running -- Running the program
stack -- Examining the stack
status -- Status inquiries
support -- Support facilities
tracepoints -- Tracing of program execution without stopping the program
user-defined -- User-defined commands

下表列出来GDB的一些基本命令:

命令描述
break设置断点:break 要设置断点的行数
clear

清除断点:clear 要清除断点的行数

delete用于清除断点和自动显示的表达式的命令
disable让所设断点暂时失效,如果要让多个编号处的断点失效,可将编号之间用空格隔开
enable与disable相对应
run 

运行调试程序

kill终止正在调试的程序
list列出产生执行文件源代码的一部分
next

执行一行源代码但不进入函数内部

step执行一行源代码并进入行数内部
quit终止gdb调试
make

在gdb中重新产生可执行文件

shell 在gdb中执行UNIX Shell命令
watch 监控一个变量而不管它的值何时改变
info break

 查看所有断点信息

info break n查看第n个断点的信息(n是第几个断点,而不是行数)
print 变量名查看变量的值

 

3、GDB调试范例

孰能生巧。略

4、GDB远程调试

关于如何远程调试,参考:嵌入式远程调试工具gdbserver

关于如何安装gdbserver,参考:linux应用调试技术之GDB和GDBServer

 

5、GDB图形前端DDD

DDD是一个简洁的GBD图形前端,可以在图形界面下进行GDB调试。如果系统没有DDD,可以输入一下命令进行安装

sudo apt-get install ddd

安装后,在终端输入ddd即可以启动DDD程序,其界面如下所示。

以一下代码为例 dbgtest.c:

#include <stdio.h>

int main(){
        int a,b;
        printf("please input two number:");
        scanf("%d %d",&a,&b);
        int sum = a + b;
        printf("the sum is %d\n",sum);
        a = 10;
}

step1:将需要调试的代码编译为可执行文件

gcc -o gdbtest gdbtest.c -g

step2:ddd gdbtest 装在可执行文件,进行调试

 

使用较为简单,略去....


断点命令:

break <source_file_name:line_num> 文件名:行号

break <function_name> 函数名

 

删除断点命令:

delete <break_point>,缩写d

delete 1   删除1号断点

 

查看堆栈命令:

backtrace,缩写bt(打印最内n层:bt n;最外n层:bt -n)

 

查看变量命令:p

p <para_name> 变量名 (可使用p直接修改变量值:p <para_name> ==xx)

 

查看所有的局部变量:info local

 

转到线程命令:thread <thread_number>

 

转到帧命令:frame <frame_number>

 

执行下一步命令:next,缩写n

 

继续运行直到下一个断点:continue,缩写c

 

进入子函数命令:step,缩写s

 

结束子函数返回到调用函数命令:finish,缩写f

 

结束循环命令:until,缩写u

 

监控变量:watch

watch expr:GDB在expr被程序写及其值改变停止;

rwatch expr:在expr被程序读时停止;

awatch expr:GDB在expr被程序读和写时停止;

 

查看所有断点信息:

info break

 

查看第n个断点的信息:

info break n

 

查看变量的值:print/f exp exp 是表达式

print 变量名

printf可以指定打印时候的表达式

 

查看内存地址:examine,缩写x

x/<n/f/u> <addr>

举例:x/10wx addr 查看10个4字节按16进制输出

x/10i addr 查看该地值的10条指令

 

显示所有thread线程(*号代表当前线程)

info thread

 

gdb现场切换到对应线程

thread thread_num

 

让一个或者多个线程执行gdb命令command

thread apply ID1 ID2 command

 

让所有被调试线程执行GDB命令command

thread apply all command

 

只给thread_num这个线程的xxx函数打断点

b xxx thread thread_num

 

set scheduler-locking off|on|step

off不锁定任何线程,也就是所有线程都执行,这是默认值

on只有当前被调试的程序会执行

step:其他线程不会执行,但是用其他命令(比如“next”)调试线程的时候,其他线程也许会执行‘

 

查看所有线程的调用栈(常用)

thread apply all bt


 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值