GDB调试讲义

1 篇文章 0 订阅

GNU DeBugger

GDBlinux下最主要的命令行调试工具。它的作用是协助程序员找到代码中的错误。如果没有GDB的帮助,程序员要想跟踪代码的执行流程,唯一的办 法就是添加大量的语句来产生特定的输出。但这一手段本身就可能会引入新的错误,从而也就无法对那些导致程序崩溃的错误代码进行分析。

GDB的出现减轻了开 发人员的负担,他们可以在程序运行的时候单步跟踪自己的代码,或者通过断点暂时中止程序的执行。此外,他们还能够随时察看变量和内存的当前状态,并监视关键的数据结构是如何影响代码运行的。

GDB主要提供4个方面的功能:

1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。

2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式、函数名、源文件的行号)

3、当程序被停住时,可以检查此时你的程序中所发生的事件。

4、动态的改变你程序的执行环境。

GDB调试命令

awatch

指定一个变量,如果这个变量被读或者被写,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令。

backtrace

查看栈信息。显示函数调用得所有栈框架(stack frames)的 踪迹和当前函数的参数的值,bt是这个命令的简写。

frame是堆栈中的一段,表示一个函数调用,每次函数调用,传递参数,局部变量等都保存在堆栈中,在一个函数的可见范围内,叫做一个frame,切换不同的frame,可以查看不同的局部变量和参数的值。

break

设置一个断点,这个命令需要指定代码行或者函数名作为参数

break filename:linenum

break filename:function 

break *address  在程序运行的内存地址上设置断点

设置条件断点:

break linenum if expr
break funcname if expr

clear

clear清除所有断点  clear <function> 清除设置在函数上的断点 clear <linenum>清除设置在指定行号的断点

continue

调试器停止的地方继续执行

Ctrl-C

在当前位置停止执行正在执行的程序,断点在当前行

disable

禁止断点功能,这个命令需要禁止的断点在断点列表索引值作为参数

display

在断点的停止的地方,显示指定的表达式的值。(显示变量)

enable

允许断点功能,这个命令需要允许的断点在断点列表索引值作为参数

finish

继续执行,直到当前函数返回

ignore

忽略某个断点制定的次数。例:ignore 4 23 忽略断点4的23次运行,在第24次的时候中断

info breakpoints

查看断点信息

info display

查看设置的需要显示的表达式的信息

kill

终止当前debug的进程

list

显示10行代码。如果没有提供参数给这个命令,则从当前行开始显示10行代码。
如果提供了函数名作为参数,则从函数开头显示。如果提供代码行的编号作为参
数,这一行作为开头显示。

load

动态载入一个可执行文件到调试器。

next

执行下一行的源代码的所有指令。如果是函数调用,不进入函数,执行到此函数返回

nexti

执行下一行的源代码中的一条汇编指令

print

显示变量的值

ptype

显示变量的类型 (对于结构体可查看其内部成员)

return

强制从当前函数返回

run

从程序开始的地方执行 ,可以在此处给程序加上命令行参数

rwatch

指定一个变量,如果这个变量被读,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令。

set

设置变量的值。例如:set variable nval=54 将把54保存到nval变量中

step

继续执行程序下一行源代码的所有指令。如果是调用函数,这个命令将进入函数的内部,单步执行函数中代码。

stepi

继续执行程序下一行源代码中的汇编指令。如果是函数调用,这个命令将进入函数的内部,单步执行函数中的汇编代码。

txbreak

在当前函数的退出的点上设置一个临时的断点(只可使用一次)。

undisplay

删除一个display设置的变量显示。这个命令需要将display list中的索引做参数。

watch

指定一个变量,如果这个变量被写,则暂停程序运行,在调试器中显示信息,并等待下一个调试命令。参考rwatch和watch命令。

whatis

查看变量和函数的类型。

xbreak

在当前函数的退出的点上设置一个断点。

 

设置断点

设置一个断点,这个命令需要指定代码行或者函数名作为参数

break filename:linenum 在指定行号上设置断点

break filename:function  在指定的函数入口处设置断点(重载函数???)

break *address  在程序运行的内存地址上设置断点

设置条件断点:

break linenum if expr
break funcname if expr

查看断点信息

Num 断点号

Type 断点类型

Disp 断点类型 del表示断点暂停1次后自动删除断点,dis表示断点暂停后关闭断点,keep表示断点暂停后继续保持断点

Enb表示断点是否启动(Enable

Address表示断点的代码地址

What表示断点在源文件中的位置

 

关闭和启动断点

enable <breakpoint number>

disable <breakpoint number>

enable delete <breakpoint number>

enable once <breakpoint number>

 

 

 

 

 

查看变量

print /fmt <expr>

expr是任何合法的表达式

fmt 是格式定义,如下表:

x

16进制

d

10进制

u

无符号格式

o

8进制

t

2进制

a

16进制格式打印地址

c

字符格式

f

浮点格式

 

查看内存

x /fmt <address>

address是任何合法的地址,如:

0x8799f00e (内存地址)

p (程序中的合法指针)

&var(程序中的合法变量)

fmt由三部分组成,NFU

N表示查看的长度

F表示格式,与print命令的格式相同

U表示单位,可以是b(字节)h(半字)w()g(双字)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值