gdb学习step by step lesson 2 : breakpoint, wathpoint

一,先贴一下我们用来练习的代码

#include <stdio.h>

int func( int n )
{
int sum = 0, i;

for( i = 0; i < n; i++ )
{
sum += i;
}

return sum;
}


void initialize( int *num, int size, int value )
{
for( int i = 0; i < size; ++i )
{
num[ i ] = value;
}
}

void set_array( int *num, int size, int value )
{
for( int i = 0; i < size; ++i )
{
num[ i ] = value;
}
}

void print_value( int *num ,int size )
{
for( int i = 0; i < size; ++i )
{
printf( "%d\t", num[i] );
}
printf("\n" );
}

void main( )
{
int i;
long result = 0;
int num[10];

for( i = 1; i <=100; i++ )
{
result += i;
}

initialize( num, sizeof(num ), 0 );

set_array( num, sizeof(num), 10 );

print_value( num, sizeof(num) );

printf( "result[1-100] = %d \n", result );
printf( "result[1-250] = %d \n", func( 250 ) );
}

为了方便演示,这个代码里面加了一些数组相关的东西


二,先看一下系统自带的帮助

(gdb) help breakpoint
Making program stop at certain points.

List of commands:

awatch -- Set a watchpoint for an expression
break -- Set breakpoint at specified line or function
catch -- Set catchpoints to catch events
clear -- Clear breakpoint at specified line or function
commands -- Set commands to be executed when a breakpoint is hit
condition -- Specify breakpoint number N to break only if COND is true
delete -- Delete some breakpoints or auto-display expressions
disable -- Disable some breakpoints
enable -- Enable some breakpoints
hbreak -- Set a hardware assisted  breakpoint
ignore -- Set ignore-count of breakpoint number N to COUNT
rbreak -- Set a breakpoint for all functions matching REGEXP
rwatch -- Set a read watchpoint for an expression
tbreak -- Set a temporary breakpoint
tcatch -- Set temporary catchpoints to catch events
thbreak -- Set a temporary hardware assisted breakpoint
watch -- Set a watchpoint for an expression

Type "help" followed by command name for full documentation.
Command name abbreviations are allowed if unambiguous.

做一个简单的翻译:

awatch         为一个表达式设置一个watchpoint,  当该表达式被读出或者值发生改变时触发

break           为某一行或者某个函数设置断点

catch   设置一个catchpoint去捕获事件

clear             清除某一行或者某个函数的断点

commands    设置当某个断点触发时要执行的命令

condition        设置当某一条件为真时断点才会被触发

delete           删除一些断点或者自动显示的表达式

disable        关掉一些断点,断点不生效,但是仍然仍在.

enable        与disable配合, 可以用来启用一些被disable掉的断点

hbreak      设置一个硬件支持断点, 这种断点需要硬件支持,这个命令的主要目的是用于对EPROM/ROM程序的调试。因为 这条命令可以在不改变代码的情况下设置断点。

                       这   可以同SPARCLite DSU 一起使用。当程序访问某些变量和代码时,DSU将设置“陷井”。注意: 你只能一次使用一个断点,在新设置断点时,先删除原断点。

ignore          只有断点被触发到一定次数时才会停下来.

rbreak         对所有的函数设置一个跟正则表达式关联的断点

rwatch         设置一个当某表达式被读出时才会触发的watchpoint

tbreak          设置一个临时的断点,只生效一次

tcatch           设置一个用来捕获事件的临时断点

thbreak        设置一个临时的硬件支持断点

watch           为一个表达式设置一个watchpoint,  当该表达式被读出或者值发生改变时触发, 这个与awatch类似


可以看到上面的东西有两部分 breakpoint和watchpoint. 我们分别来学习两部分的东西.



三,  breakpoint 相关的东西

(1)  添加断点

       添加断点的方式有以下几种:

  I       break 函数名   在某个函数开始处设置断点

        II       break +行数   在程序的当前执行位置的前几行设置断点.

        III      break  -行数   在程序的当前执行位置的后几行设置断点.

        IV    break   行号    在程序的第几行设置断点, 程序执行到当前行之前一行就会停止

  V      break  文件名: 行号 在某一文件的某一行设置断点.

        VI     break   文件名:函数名  在某一文件中的某一函数的开始设置断点

  VII    break   *address      在当前地址上存储的代码位置处设置断点

  VIII    break                           'break'命令在当前执行到的程序运行栈中的下一条指令上设置一个断点。除了栈底以外,这个命令使 程序在一旦从当前函数返回时停止。

                                                   相似的命令是'finish',但'finish' 并不设置断点。这一点在循环语句中很有用.

        IX      break  ...  if conditon          当执行到某个断点时, 要先检查一下条件是否成立才决定是否要触发该断点

 

  这个break命令的使用方法跟之前的list方法是近似的, 都是一个命令+位置. 其中表示位置的方法是类似的, 所以就不具体贴贴图了.

我们只使用其中的几个加几个简单的断点.

(gdb) info break
No breakpoints or watchpoints.
(gdb) b print_      
print_and_abort        print_missing_version  print_unresolved       
print_header           print_statistics       print_value            
(gdb) b print_value
Breakpoint 5 at 0x400566: file break.c, line 34.
(gdb) b 20
Breakpoint 6 at 0x4004f8: file break.c, line 20.
(gdb) b initial
initial     initialize  
(gdb) b initialize
Breakpoint 7 at 0x4004e9: file break.c, line 18.
(gdb) info break
Num Type           Disp Enb Address            What
5   breakpoint     keep y   0x0000000000400566 in print_value at break.c:34
6   breakpoint     keep y   0x00000000004004f8 in initialize at break.c:20
7   breakpoint     keep y   0x00000000004004e9 in initialize at break.c:18


上面先用info break显示当前的断点为空,

然后给20行加一个代码, 给两个函数加了两个断点了.

这里有个提示 在写函数时,如果不知道有哪些函数,可以用info func来显示所有函数名. 然后在输入函数名的时候,可以输到一半时按两下TAB 来给出后缀提示.


(2)  显示数据相关的命令

四,   watchpoint相关的东西


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值