GDB调试

另外有:

Gdb+core调试技术

    http://zhwen.org/xlog/?p=453


一、gdb简介和安装

GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。一般来说,GDB主要帮忙你完成下面四个方面的功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。

要使用GDB,首先确认是否安装了gdb,在命令行中执行gdb,会自动进入dgb命令界面中,看到下面信息说明已经安装。

GNU gdb (GDB) CentOS (7.0.1-42.el5.centos.1)
Copyright (C) 2009 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 "x86_64-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
(gdb) Quit

没有安装的话,通过yum命令来安装。

yum install gdb

二、gdb常用命令

file 装入想要调试的可执行文件.
kill 终止正在调试的程序.
List 查看源代码
list lineNum 在lineNum的前后源代码显示出来
list + 列出当前行的后面代码行
list - 列出当前行的前面代码行
list function 列出函数
set listsize count 设置显示代码的行数
show listsize 显示打印代码的行数
list first,last  显示从first到last的源代码行
next 执行一行源代码但不进入函数内部.
step 执行一行源代码而且进入函数内部.
run 执行当前被调试的程序
quit 终止 gdb
watch 使你能监视一个变量的值而不管它何时被改变.
break 在代码里设置断点, 这将使程序执行到这里时被挂起.
make 使你能不退出 gdb 就可以重新产生可执行文件.
shell 使你能不离开 gdb 就执行 UNIX shell 命令.

三、调试c/c++程序

1、新建 hello.c 文件

#include <stdio.h>

int main(){
char str[]="hello!\n";
printf(str);
int a = 5;
int b = 6;
int c = add(a,b);
printf("%d\n",c);
return 1;
}

int add(int a,int b){
return a+b;
}

2、编译

gcc -o hello hello.c
gcc -g -o hello hello.c  要使用gdb调试,必须使用-g 参数

3、调试代码

gdb hello #载入hello程序

(gdb) l  #列出源码
1       #include <stdio.h>
2
3       int main(){
4           char str[]="hello!\n";
5           printf(str);
6           int a = 5;
7           int b = 6;
8           int c = add(a,b);
9           printf("%d\n",c);
10          return 1;
(gdb) break 5  #在第5行下断
Breakpoint 1 at 0x4004ab: file hello.c, line 5.
(gdb) info break #查看当前的断点信息
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004ab in main at hello.c:5
(gdb) r #运行程序 可以看到下面在第5行自动拉截了
Starting program: /opt/apps/gdb/hello

Breakpoint 1, main () at hello.c:5
5           printf(str);
(gdb) p str #打印str变量值
$1 = "hello!\n"
(gdb)  #单步执行下行代码
hello!
6           int a = 5;
(gdb) n #单步执行下行代码
7           int b = 6;
(gdb) p a #打印变量a
$2 = 5
(gdb) p b #打印变量b
$3 = 0
(gdb) n #单步执行下行代码
8           int c = add(a,b);
(gdb) p b #打印变量b
$4 = 6
(gdb) break add #在函数add方法里面下断
Breakpoint 2 at 0x4004fd: file hello.c, line 14.
(gdb)  #继续执行,直到断点位置
Continuing.

Breakpoint 2, add (a=5, b=6) at hello.c:14
14          return a+b;
(gdb) bt  #查看函数调用信息
#0  add (a=5, b=6) at hello.c:14
#1  0x00000000004004d7 in main () at hello.c:8
(gdb) finish #跳出函数
Run till exit from #0  add (a=5, b=6) at hello.c:14
0x00000000004004d7 in main () at hello.c:8
8           int c = add(a,b);
Value returned is $5 = 11
(gdb) c  #继续执行,直到断点位置
Continuing.
11

Program exited with code 01.
(gdb) q #退出gdb 上面已经正常执行完毕

 

除了通过gdb <program>  调试外,也可以执行下面2个调试命令

1、gdb <program> core
用gdb同时调试一个运行程序和core文件,core是程序非法执行后core dump后产生的文件。

2、gdb <program> <PID>
如果你的程序是一个服务程序,那么你可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试他。program应该在PATH环境变量中搜索得到。

四、参考

资源下载链接为: https://pan.quark.cn/s/d9ef5828b597 四路20秒声光显示计分抢答器Multisim14仿真源文件+设计文档资料摘要 数字抢答器由主体电路与扩展电路组成。优先编码电路、锁存器、译码电路将参赛队的输入信号在显示器上输出;用控制电路和主持人开关启动报警电路,以上两部分组成主体电路。通过定时电路和译码电路将秒脉冲产生的信号在显示器上输出实现计时功能,构成扩展电路。经过布线、焊接、调试等工作后数字抢答器成形。关键字:开关阵列电路;触发锁存电路;解锁电路;编码电路;显示电路 一、设计目的 本设计是利用已学过的数电知识,设计的4人抢答器。(1)重温自己已学过的数电知识;(2)掌握数字集成电路的设计方法和原理;(3)通过完成该设计任务掌握实际问题的逻辑分析,学会对实际问题进行逻辑状态分配、化简;(4)掌握数字电路各部分电路与总体电路的设计、调试、模拟仿真方法。 二、整体设计 (一)设计任务与要求: 抢答器同时供4名选手或4个代表队比赛,分别用4个按钮S0 ~ S3表示。 设置一个系统清除和抢答控制开关S,该开关由主持人控制。 抢答器具有锁存与显示功能。即选手按动按钮,锁存相应的编号,并在LED数码管上显示,同时扬声器发出报警声响提示。选手抢答实行优先锁存,优先抢答选手的编号一直保持到主持人将系统清除为止。 参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。 如果定时时间已到,无人抢答,本次抢答无效。 (二)设计原理与参考电路 抢答器的组成框图如下图所示。它主要由开关阵列电路、触发锁存电路、解锁电路、编码电路和显示电路等几部分组成。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值