Linux C编程(2) dgb调试
1. 首先编写一个用于调试的测试程序test.c
#include <stdio.h> int get_sum(int n)
{
int sum = ,i;
for(i = ; i <=n ; i++)
{
sum+=i;
}
return sum;
}
int main()
{
int i = ,result;
result = get_sum(i);
printf("1+2+...+100=%d\n",result);
return ;
}
编译并运行
[root@localhost ctest]# gcc test.c -o test
[root@localhost ctest]# ./test
++...+=
gdb调试程序的命令格式为:gdb 可执行的程序文件名,加上-q选项可以不输出版权说明
[root@localhost ctest]# gdb -q test
Reading symbols from /tmp/ctest/test...(no debugging symbols found)...done.
(gdb)
使用q/quit可以退出gdb。
2. 显示和查找程序源代码
(1) list:显示10行代码,再次运行时显示接下来的10行代码
(2) list 5,10:显示5~10行代码
(3) list test.c:5,10:显示源文件test.c中 的5~10行代码,在调试含有多个源文件程序时使用。
(4) list get_sum:显示get_sum函数周围的代码
(5) list test.c:get_sum:显示源文件test.c中get_sum函数周围的代码,在调试多个源文件程序时使用。
例:
(gdb) list ,
{
int sum = ,i;
for(i = ; i <=n ; i++)
{
sum+=i;
}
return sum;
(gdb) list get_sum
#include <stdio.h> int get_sum(int n)
{
int sum = ,i;
for(i = ; i <=n ; i++)
{
sum+=i;
}
return sum;
(gdb)
在调试的过程中如要使用Linux命令,可以在gdb提示符下输入shell命令,如:
(gdb) shell ls
datatype.c file1.c num_game.c p3.c symbalconstant.c test
test.c digui.c getc.c p2.c sequence.c taijie.c
(gdb)
search 和forward用来从当后行向前查找第一个匹配的字符串,reverse-search用来从当前行向前查找第一个匹配的字符串,如:
(gdb) search get_sum
result = get_sum(i);
(gdb) reverse-search main
int main()
(gdb)
3. 执行程序和获得帮助
使用gdb -q test只是装入程序,程序并没有运行。运行需输入run命令,如:
(gdb) run
Starting program: /tmp/ctest/test
++...+= Program exited normally.
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.i686
(gdb)
如果想要详细了解某个命令的使用方法,可以使用help命令,如:
(gdb) help list
(gdb) help all
4. 设置和管理断点
(1) 以行号设置断点,使用break命令,如:
(gdb) break
Breakpoint at 0x80483da: file test.c, line .
(gdb)
第二行为设置断点后的反馈信息,包括:当前设置的断点,断点所在的内存地址及所在行号。输入run后,程序运行到第8行的指令后就暂停。
(gdb) run
Starting program: /tmp/ctest/test Breakpoint , get_sum (n=) at test.c:
sum+=i;
(gdb)
(2) 以函数名设置断点,如:
(gdb) break get_sum
Breakpoint at 0x80483ca: file test.c, line .
(gdb) run
Starting program: /tmp/ctest/test Breakpoint , get_sum (n=) at test.c:
int sum = ,i;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.i686
(gdb)
(3) 以条件表达式设置断点,程序在运行过程中,当某个条件满足时,程序在某行中断暂停执行,其格式为:
break 行号或函数名 if 条件
(gdb) break if i==
Breakpoint at 0x80483da: file test.c, line .
(gdb) run
Starting program: /tmp/ctest/test Breakpoint , get_sum (n=) at test.c:
sum+=i;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.i686
(gdb)
(4) 不需要指定行号或函数,而是在整个程序运行中当条件表达式的值发生改变时程序就会暂停。,其格式为:
watch 条件表达式
[root@localhost ctest]# gdb -q test
Reading symbols from /tmp/ctest/test...done.
(gdb) watch i==99 // 由于test没有运行,变量i还没被定义
No symbol "i" in current context.
(gdb) break 7 // 设置断点
Breakpoint at 0x80483da: file test.c, line .
(gdb) run // 运行至断点处
Starting program: /tmp/ctest/test Breakpoint , get_sum (n=) at test.c:
sum+=i;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.i686
(gdb) watch i==99 // 变量i已定义,可以设置
Hardware watchpoint : i==
(gdb) clear 7 // 删除所设断点
Deleted breakpoint
(gdb) continue //程序继续运行,表达式的值从i==99由原来0变到1,因此程序中断
Continuing.
Hardware watchpoint : i== Old value =
New value =
0x080483e4 in get_sum (n=) at test.c:
for(i = ; i <=n ; i++)
(gdb) print i // 显示i
$ =
(gdb) print sum // 显示sum
$ =
(gdb) next
sum+=i;
(gdb) print i
$ =
(gdb) print sum
$ =
(gdb) next // 继续执行下一条语句
for(i = ; i <=n ; i++)
(gdb) print i
$ =
(gdb) print sum
$ =
(gdb) next
sum+=i;
(gdb) print i
$ =
(gdb) print sum
$ =
(gdb) next
for(i = ; i <=n ; i++)
(gdb) print i
$ =
(gdb) print sum
$ =
(gdb)
5. 查看当前设置的中断点
采用info breakpoints命令可以查看当前所有的中断点,如:
(gdb) break
Breakpoint at 0x80483da: file test.c, line .
(gdb) break if result==
Breakpoint at 0x8048412: file test.c, line .
(gdb) info breakpoints
Num Type Disp Enb Address What
breakpoint keep y 0x080483da in get_sum at test.c:
breakpoint keep y 0x08048412 in main at test.c:
stop only if result==
(gdb)
Num:编号,Type:类型,Disp:指示中断点在生效一次后是否会失去作用,是位dis,否为keep,End:表明当前中断点是否有效,Adress:表示中断所处的内存地址,What:列出中断发生在哪个函数的第几行,最后一行表明这是一个条件中断。
5. 使中断失效或有效
使用"disable 断点编号"可以是某个断点失效,程序运行到该断点不会停下来而是继续运行。
使用“enable 断点编号”可以使某个断点恢复有效。
(gdb) info breakpoints
Num Type Disp Enb Address What
breakpoint keep y 0x080483da in get_sum at test.c:
breakpoint keep y 0x08048412 in main at test.c:
stop only if result==
(gdb) disalbe
Undefined command: "disalbe". Try "help".
(gdb)
(gdb) info breakpoints
Num Type Disp Enb Address What
breakpoint keep y 0x080483da in get_sum at test.c:
breakpoint keep y 0x08048412 in main at test.c:
stop only if result==
(gdb) disable
(gdb) info breakpoints
Num Type Disp Enb Address What
breakpoint keep y 0x080483da in get_sum at test.c:
breakpoint keep n 0x08048412 in main at test.c:
stop only if result==
(gdb) enable
(gdb) info breakpoints
Num Type Disp Enb Address What
breakpoint keep y 0x080483da in get_sum at test.c:
breakpoint keep y 0x08048412 in main at test.c:
stop only if result==
(gdb)
6. 删除断点
disable只是让某个某个断点暂时失效,断点依然存在于程序中。彻底删除断点可使用clear或delete命令。
格式为:
(1) clear:删除程序中所有的断点
(2) clear 行号:删除此行的断点
(3) clear 函数名:删除该函数的断点
(4) delete 断点编号:删除指定编号的断点,如果一次要删除多个断点,各个断点编号以空格隔开。
[root@localhost ctest]# gdb -q test
Reading symbols from /tmp/ctest/test...done.
(gdb) break
Breakpoint at 0x80483d1: file test.c, line .
(gdb) break
Breakpoint at 0x80483da: file test.c, line .
(gdb) break if sum==
Note: breakpoint also set at pc 0x80483da.
Breakpoint at 0x80483da: file test.c, line .
(gdb) info breakpoints
Num Type Disp Enb Address What
breakpoint keep y 0x080483d1 in get_sum at test.c:
breakpoint keep y 0x080483da in get_sum at test.c:
breakpoint keep y 0x080483da in get_sum at test.c:
stop only if sum==
(gdb) clear
Deleted breakpoint
(gdb) info breakpoints
Num Type Disp Enb Address What
breakpoint keep y 0x080483da in get_sum at test.c:
breakpoint keep y 0x080483da in get_sum at test.c:
stop only if sum==
(gdb) delete ,
warning: bad breakpoint number at or near '2,3'
(gdb) info breakpoints
Num Type Disp Enb Address What
breakpoint keep y 0x080483da in get_sum at test.c:
breakpoint keep y 0x080483da in get_sum at test.c:
stop only if sum==
(gdb) delete
(gdb) info breakpoints
No breakpoints or watchpoints.
7. 查看和设置变量的值
(1) print命令的格式有:
print 变量或表达式:打印变量或表达式当前的值
print 变量=值:对变量进行赋值
print 表达式@要打印的值的个数:打印以表达式值开始的n个数
(2) whatis命令,用于显示某个变量或表达式值的数据类型,七个是我:whatis 变量或表达式
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /tmp/ctest/test Breakpoint , get_sum (n=) at test.c:
sum+=i;
(gdb) whatis i
type = int
(gdb) whatis sum+0.5
type = double
(gdb)
(3) set命令,用于给变量赋值,其格式为:set variable 变量=值,set也可以针对远程调试进行设置,可以用来设置gdb一行的字符数等。
8. 控制程序的执行
(1) continue命令:让程序继续执行,直到下一个断点或运行完为止。
(2) kill命令:用于结束当前程序的调试。
(3) next和step命令:一次一条执行该代码段,二者的区别是:如果遇到函数调用,next会把该函数当做一条语句来执行,再次输入next会执行函数调用后的语句,而step则会跟踪进入函数,一次一条地执行函数内的代码,直到函数内的代码执行完,才执行函数调用后的语句。
[root@localhost ctest]# gdb -q test
Reading symbols from /tmp/ctest/test...done.
(gdb) list ,
#include <stdio.h> int get_sum(int n)
{
int sum = ,i;
for(i = ; i <=n ; i++)
{
sum+=i;
}
return sum;
}
int main()
{
int i = ,result;
result = get_sum(i);
printf("1+2+...+100=%d\n",result);
return ;
}
(gdb) break
Breakpoint at 0x80483fa: file test.c, line .
(gdb) run
Starting program: /tmp/ctest/test Breakpoint , main () at test.c:
int i = ,result;
Missing separate debuginfos, use: debuginfo-install glibc-2.12-1.132.el6.i686
(gdb) next
result = get_sum(i);
(gdb) next
printf("1+2+...+100=%d\n",result);
(gdb) next
++...+=
return ;
(gdb)
(gdb) continue
Continuing. Program exited normally.
(gdb)
(gdb) run
Starting program: /tmp/ctest/test Breakpoint , main () at test.c:
int i = ,result;
(gdb) step
result = get_sum(i);
(gdb) step
get_sum (n=) at test.c:
int sum = ,i;
(gdb) step
for(i = ; i <=n ; i++)
(gdb)
(4) nexti和stepi命令
nexti和stepi命令用来单步执行一条及其指令,注意不是单步执行!一条语句由多条机器指令构成。
例:for(i=0;i<n;i++),如果是单步执行一条指令,则这行语句要输入多个nexti或stepi才能完成,i=0和i<n会分开执行。
(gdb) step
for(i = ; i <=n ; i++)
(gdb) stepi
0x080483d8 for(i = ; i <=n ; i++)
(gdb) stepi
0x080483e4 for(i = ; i <=n ; i++)
(gdb) stepi
0x080483e7 for(i = ; i <=n ; i++)
(gdb) stepi
0x080483ea for(i = ; i <=n ; i++)
(gdb) stepi
sum+=i;
Linux C编程(2) dgb调试的更多相关文章
- storysnail的Linux串口编程笔记
storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...
- linux网络编程-(socket套接字编程UDP传输)
今天我们来介绍一下在linux网络环境下使用socket套接字实现两个进程下文件的上传,下载,和退出操作! 在socket套接字编程中,我们当然可以基于TCP的传输协议来进行传输,但是在文件的传输中, ...
- linux网络编程_1
本文属于转载,稍有改动,以利于学习. (一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个 ...
- Linux网络编程入门 (转载)
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- [转] - Linux网络编程 -- 网络知识介绍
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- Linux 系统编程
简介和主要概念 Linux 系统编程最突出的特点是要求系统程序员对它们工作的的系统的硬件和操作系统有深入和全面的了解,当然它们还有库和系统调用上的区别. 系统编程分为:驱动编程.用户空间编程和网络编程 ...
- Linux Bash命令关于程序调试详解
转载:http://os.51cto.com/art/201006/207230.htm 参考:<Linux shell 脚本攻略>Page22-23 Linux bash程序在程序员的使 ...
- 【转】Linux网络编程入门
(一)Linux网络编程--网络知识介绍 Linux网络编程--网络知识介绍客户端和服务端 网络程序和普通的程序有一个最大的区别是网络程序是由两个部分组成的--客户端和服务器端. 客户 ...
- Linux多线程编程小结
Linux多线程编程小结 前一段时间由于开题的事情一直耽搁了我搞Linux的进度,搞的我之前学的东西都遗忘了,非常烦躁的说,如今抽个时间把之前所学的做个小节.文章内容主要总结于<Linux程序 ...
随机推荐
- iOS 开启data protection 的方法
我这里说的data protection,指的是设备设置密码后,如果设备锁屏,并且当前解锁需要密码(有时可能因为自己的设定,导致会再几小时后才需要密码),这时应用程序处于加密状态,无法从外部读取.如果 ...
- eclipse快捷键Alt + / 失效
最近电脑上的Eclipse没有了自动提示功能,也不是全部不提示,大多数情况下按下"alt+/"键还会产生提示,但是当我在java项目中邪main方法和syso的时候,"a ...
- jquery中dom元素的attr和prop方法的理解
一.背景 在编写使用高版本[ jQuery 1.6 开始新增了一个方法 prop()]的jquery插件进行编写js代码的时候,经常不知道dom元素的attr和prop方法到底有什么区别?各自有什么应 ...
- ZooKeeper 配置文件(zoo.cfg)详解
参数名 说明 clientPort 客户端连接server的端口,即对外服务端口,一般设置为2181吧. dataDir 存储快照文件snapshot的目录.默认情况下,事务日志也会存储在这里.建议同 ...
- python 获取启动参数
pytho软件编写过程中,会经常使用带参数的启动脚本,这里记载下如何获取输入的参数. 使用sys.argv可获取启动时输入的所有参数,这个是数组,直接使用[]就可以获取,[0]代表的是启动文件时输入的 ...
- python基础——模块
python基础——模块 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文 ...
- iOS 百度地图坐标标注
注:由于iOS9改用更安全的https,为了能够在iOS9中正常使用地图SDK,请在"Info.plist"中进行如下配置,否则影响SDK的使用. <key>NSApp ...
- NYOJ之字符串逆序输出
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAswAAAJaCAIAAAC0jIYTAAAgAElEQVR4nO3du27rSpbGcb+Ecz2IU+ ...
- 《Thinking in Java》十七章_容器深入研究_练习13(Page484)
练习13: 单词计数器 import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFou ...
- 二、JavaScript语言--JS实践--倒计时效果
主要内容:分析不同倒计时效果的计算思路及方法,掌握日期对象Date,获取时间的方法,计算时差的方法,实现不同的倒时计效果. Javascript 日期对象: Date()返回当前的日期和时间 getY ...