Linux下进行GDB调试
2013-01-01 17:31
344 查看
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具
一般来说,GDB主要帮助自己完成下面四个方面的功能;
1:启动你的程序,可以按照你的自定义的要求随心所欲的运行程序
2:可以让被调试的程序在你所指定的调制的断点处停住(断点可以是条件表达式)
3:当程序被停住时,可以检查你的程序中发生的事
4:动态的改变你程序的执行环境
利用print命令可以检查各个变量的值。
(gdb)print p (p为变量名) print是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容: 对程序中函数的调用
(gdb)print find_entry(1,0)
数据结构和其他复杂对象 (gdb)print *table_start
={e=reference=’\000’,location=0x0,next=0x0} 值的历史成分 (gdb)print(为历史记录变量,在以后可以直接引用的值)
因此,要想显示在h后面的10个元素,可以使用h@10: (gdb)printh@10
=(-1,345,23,-234,0,0,0,98,345,10) whatis命令可以显示某个变量的类型
(gdb)whatis p
type= int *
break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式: breakline-number
使程序恰好在执行给定行之前停止。 breakfunction-name
使程序恰好在进入指定的函数之前停止。 breakline-or-function if condition
如果condition(条件)是真,程序到达指定行或函数时停止。 breakroutine-name
在指定例程的入口处设置断点 如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下: (gdb)break filename:line-number
(gdb)break filename:function-name
要想设置一个条件断点,可以利用breakif命令,如下所示: (gdb)break
line-or-function if expr
finish结束执行的当前函数,显示其返回值
一个程序例子
源程序:tst.c
1#include <stdio.h>
2
3int func(int n)
4{
5int sum=0,i;
6for(i=0; i<=n; i++)
7{
8sum+=i;
9}
10return sum;
11}
12
13
14main()
15{
16int i;
17long result = 0;
18for(i=1; i<=100; i++)
19{
20result += i;
21}
22
23printf("result[1-100] = %d \n", result );
24printf("result[1-250] = %d \n", func(250) );
25}
编译生成执行文件:(Linux下) hchen/test>gcc
-g tst.c -o tst
使用GDB调试:
hchen/test>gdb tst <----------
启动GDB
GNUgdb 5.1.1
Copyright2002 Free Software Foundation, Inc.
GDBis free software, covered by the GNU General Public License, and youare
welcometo change it and/or distribute copies of it under certain conditions. Type"show
copying" to see the conditions. Thereis absolutely no warranty for GDB. Type "show warranty" fordetails.
ThisGDB was configured as "i386-suse-linux"...
(gdb)l <-------------------- l命令相当于list,从第一行开始例出原码。
1#include <stdio.h>
2
3int func(int n)
4{
5int sum=0,i;
6for(i=0; i<=n; i++)
7{
8sum+=i;
9}
10return sum;
整个过程:
首先写出源代码文件
写出之后进行编译生成不带.c的可执行文件
命令
gcc -g tst.c -o tst
再进行启用GDB来调试
gdbtst
(gdb)l l命令相当于list,从第一行开始例出原码。
(gdb)break 16
设置断点,在源程序16行处
breakfunc <--------------------
设置断点,在函数func()入口处。
(gdb)infobreak
察看断点信息
(r)运行程序 ,run命令简写
(gdb)n <---------------------
单条语句执行,next命令简写。
gdb)c <---------------------
继续运行程序,continue命令简写。
(gdb)p sum
gdb)bt <---------------------
查看函数堆栈。
(gdb)finish <---------------------
退出函数。
(gdb)c <---------------------
继续运行。
gdb)q <---------------------
退出gdb。
一般来说,GDB主要帮助自己完成下面四个方面的功能;
1:启动你的程序,可以按照你的自定义的要求随心所欲的运行程序
2:可以让被调试的程序在你所指定的调制的断点处停住(断点可以是条件表达式)
3:当程序被停住时,可以检查你的程序中发生的事
4:动态的改变你程序的执行环境
利用print命令可以检查各个变量的值。
(gdb)print p (p为变量名) print是gdb的一个功能很强的命令,利用它可以显示被调试的语言中任何有效的表达式。表达式除了包含你程序中的变量外,还可以包含以下内容: 对程序中函数的调用
(gdb)print find_entry(1,0)
数据结构和其他复杂对象 (gdb)print *table_start
={e=reference=’\000’,location=0x0,next=0x0} 值的历史成分 (gdb)print(为历史记录变量,在以后可以直接引用的值)
因此,要想显示在h后面的10个元素,可以使用h@10: (gdb)printh@10
=(-1,345,23,-234,0,0,0,98,345,10) whatis命令可以显示某个变量的类型
(gdb)whatis p
type= int *
break命令(可以简写为b)可以用来在调试的程序中设置断点,该命令有如下四种形式: breakline-number
使程序恰好在执行给定行之前停止。 breakfunction-name
使程序恰好在进入指定的函数之前停止。 breakline-or-function if condition
如果condition(条件)是真,程序到达指定行或函数时停止。 breakroutine-name
在指定例程的入口处设置断点 如果该程序是由很多原文件构成的,你可以在各个原文件中设置断点,而不是在当前的原文件中设置断点,其方法如下: (gdb)break filename:line-number
(gdb)break filename:function-name
要想设置一个条件断点,可以利用breakif命令,如下所示: (gdb)break
line-or-function if expr
finish结束执行的当前函数,显示其返回值
一个程序例子
源程序:tst.c
1#include <stdio.h>
2
3int func(int n)
4{
5int sum=0,i;
6for(i=0; i<=n; i++)
7{
8sum+=i;
9}
10return sum;
11}
12
13
14main()
15{
16int i;
17long result = 0;
18for(i=1; i<=100; i++)
19{
20result += i;
21}
22
23printf("result[1-100] = %d \n", result );
24printf("result[1-250] = %d \n", func(250) );
25}
编译生成执行文件:(Linux下) hchen/test>gcc
-g tst.c -o tst
使用GDB调试:
hchen/test>gdb tst <----------
启动GDB
GNUgdb 5.1.1
Copyright2002 Free Software Foundation, Inc.
GDBis free software, covered by the GNU General Public License, and youare
welcometo change it and/or distribute copies of it under certain conditions. Type"show
copying" to see the conditions. Thereis absolutely no warranty for GDB. Type "show warranty" fordetails.
ThisGDB was configured as "i386-suse-linux"...
(gdb)l <-------------------- l命令相当于list,从第一行开始例出原码。
1#include <stdio.h>
2
3int func(int n)
4{
5int sum=0,i;
6for(i=0; i<=n; i++)
7{
8sum+=i;
9}
10return sum;
整个过程:
首先写出源代码文件
写出之后进行编译生成不带.c的可执行文件
命令
gcc -g tst.c -o tst
再进行启用GDB来调试
gdbtst
(gdb)l l命令相当于list,从第一行开始例出原码。
(gdb)break 16
设置断点,在源程序16行处
breakfunc <--------------------
设置断点,在函数func()入口处。
(gdb)infobreak
察看断点信息
(r)运行程序 ,run命令简写
(gdb)n <---------------------
单条语句执行,next命令简写。
gdb)c <---------------------
继续运行程序,continue命令简写。
(gdb)p sum
gdb)bt <---------------------
查看函数堆栈。
(gdb)finish <---------------------
退出函数。
(gdb)c <---------------------
继续运行。
gdb)q <---------------------
退出gdb。
相关文章推荐
- (基于 TI8168) LINUX下QT环境配置,能用GDB+GDBSERVER进行调试
- LINUX平台可以用GDB进行反汇编和调试。
- Linux下使用GDB进行调试
- Linux下的c如何进行GDB调试
- Linux下的gdb对代码进行调试
- Linux下使用gdb进行单步调试(一)
- 【嵌入式Linux学习七步曲之第二篇 ARM+Linux开发环境】gdb+gdbserver的方式进行ARM程序调试
- Linux下使用gdb进行单步调试(二)
- 使用gdb、gdbserver在ARM-Linux下进行远程调试
- 在Linux平台用gdb进行反汇编和调试
- Linux下使用gdb进行单步调试(三)
- 如果在Linux平台可以用gdb进行反汇编和调试
- 用gdb进行linux代码的调试
- LINUX平台可以用GDB进行反汇编和调试。
- 【嵌入式Linux学习七步曲之第二篇 ARM+Linux开发环境】gdb+gdbserver的方式进行ARM程序调试
- LINUX平台可以用GDB进行反汇编和调试。
- [置顶] Linux 使用gdb对c/c++代码进行调试
- LINUX平台可以用GDB进行反汇编和调试。
- 转Linux平台可以用gdb进行反汇编和调试。
- (转载)Linux平台可以用gdb进行反汇编和调试