linux学习之四---gdb调试
在Linux应用程序开发中,最经常使用的调试器是gdb。
一、启动和退出gdb
gdb调试的对象是可运行文件,而不是程序的源码。假设要使一个可运行文件能够被gdb调试,那么使用编译器gcc编译时须要增加-g选项。-g选项告诉gcc在编译时增加调试信息,这样gdb才干够调试这个被编译的程序。
1.编译test.c源程序
gcc -g test.c -o test
./test
test.c中的源代码为:
#include<stdio.h> int get_sum(int n)
{
int sum=0,i;
for(i=0;i<n;i++)
sum+=i;
return sum;
} int main()
{
int i=100,result;
result=get_sum(i);
printf("1+2+...+%d=%d\n",i,result);
return 0;
}
2.启动gdb
格式一:gdb test
直接输入上面的语句启动gdb,会得到gdb的版本号信息,并进入gdb调试。
pc@ubuntu:~/linux_lan/3$ gdb test
GNU gdb (GDB) 7.5.91.20130417-cvs-ubuntu
Copyright (C) 2013 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-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/pc/linux_lan/3/test...done.
格式二:gdb -q test
pc@ubuntu:~/linux_lan/3$ gdb -q test
Reading symbols from /home/pc/linux_lan/3/test...done.
(gdb)
3.退出gdb
直接quit就可以。
二、显示和查找程序源码
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函数周围的代码。
三、运行程序和获得帮助
运行程序格式:run
获得帮助格式:help list
help all
四、设置和管理断点
在调试程序时,往往须要程序在执行到某行、某个函数或某个条件时暂停下来,然后检查此时程序的状态,如各个变量的值、某个表达式的值等。
因此须要设置断点,使程序在执行到某个位置暂停下来,来检查和分析程序。
因此。学习设置和管理断点是很必要的。
1.以行号设置断点
在gdb中,大部分都使用break命令来为程序设置断点。最经常使用的是为某行设置断点。
格式:break 7
运行后显示设置断点后的反馈信息:
(gdb) break 7
Breakpoint 1 at 0x400543: file test.c, line 7.
2.以函数名设置断点
格式:break get_sum
运行后显示设置断点后的反馈信息:
(gdb) break get_sum
Breakpoint 1 at 0x400533: file test.c, line 5.
3.以条件表达式设置断点
格式:break 7 if i==99
能够看到,程序执行到i==99时,程序中断在第7行:
(gdb) break 7 if i==99
Breakpoint 1 at 0x400543: file test.c, line 7.
4.特殊设置断点的方式
格式:watch i==99
这样的会出现一个问题,直接运行上面语句。会显演示样例如以下:
(gdb) watch i==99
No symbol "i" in current context.
gdb提示在当前程序上下文中没有符号i。折算由于此时test程序没有执行,变量i没有定义,为了解决问题,首先在第6行设置中断,然后使用run命令执行程序,程序暂停在第6行,此时i已被定义,所以watch i==99 设这断点成功。
由于第6行断点已经没实用了。能够通过clear 6 命令删除该行的断点。
5.run命令
格式;run
运行该程序,直到程序结束或遇到断点。
6.clear命令 (删除设置的断点)
格式:clear 行数
显示:删除该行断点
(gdb) clear 7
已删除的断点 1
格式:clear 函数名
显示:删除该函数中的断点
(gdb) clear get_sum
已删除的断点 2
7.delete命令 (依据断点编号删除)
格式:delete 断点编号
8.info breakpoints (查看当前设置的中断)
格式:info breakpoints
显示:
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400543 in get_sum at test.c:7
stop only if i==99
breakpoint already hit 1 time
11.使中断失效或有效
格式:disable 中断号
显示:第2个中断End被设为‘n’
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400543 in get_sum at test.c:7
stop only if i==99
breakpoint already hit 1 time
2 breakpoint keep y 0x0000000000400533 in get_sum at test.c:5
(gdb) disable 2
(gdb) info breakpoints
Num Type Disp Enb Address What
1 breakpoint keep y 0x0000000000400543 in get_sum at test.c:7
stop only if i==99
breakpoint already hit 1 time
2 breakpoint keep n 0x0000000000400533 in get_sum at test.c:5
五、查看和设置变量的值
当程序运行到中断点暂停运行时,往往要查看变量或表达式的值。来了解程序的运行状态,进而发现问题所在。
1.print命令
一般用来打印变量或表达式的值。也能够用来打印内存中某个变量開始的一段内存区域的内容,还能够用来对某个变量进行赋值。
格式:print 变量或表达式 打印变量或表达式的当前值
print 变量=值 对变量赋值
2.whatis命令
whatis命令用来显示某个变量或表达式值的数据类型。
格式:whatis 变量表达式
3.set命令
set命令用来给变量赋值
格式:set variable 变量=值
六、控制程序的运行
当程序执行到指定的中断点。查看了变量或表达式的值后,能够让程序继续执行。能够让程序一步一步地执行,也能够让程序一直执行下去直到下一个断点或执行完为止。
1.continue命令
让程序继续执行。直到下一个断点或执行完为止。
格式:continue
2.kill命令
该命令用于结束当前程序的调试,在gdb提示符下输入kill。gdb会询问是否退出当前程序的调试,输入y结束调试。输入n继续调试程序。
格式:kill
3.next和step命令
在调试程序时,有时会怀疑程序的错误可能出如今某个地方,那么能够使用next或step命令一次一条运行该段代码。
next与step的差别是:假设遇到函数调用,next会把该函数调用当作一条语句来运行。再次输入next会运行函数调用后的语句,而step则会跟踪进入函数,一次一条地运行函数的代码,直到函数内的代码运行完。才运行函数调用后的语句。
4.nexti和stepi命令
nexti与stepi命令用来单步运行一条机器指令。注意不是单步运行一条语句。
单步运行一条语句是next和step。通常一条语句由多条机器指令构成。
比如for(i=0;i<n;i++)
假设输入next或step一次就可以运行完。可是单步运行一条语句,则这行语句要输入多个nexti和stepi才干运行完。
nexti与stepi的差别和next与step差别一样,不在赘述。
linux学习之四---gdb调试的更多相关文章
- 【转】 linux编程之GDB调试
GDB是一套字符界面的程序集,可以用它在linux上调试C和C++程序,它提供了以下的功能: 1 在程序中设置断点,当程序运行到断点处暂停 2 显示变量的值,可以打印或者监视某个变量,将某个变量的值显 ...
- linux编程之GDB调试
GDB是一套字符界面的程序集,可以用它在linux上调试C和C++程序,它提供了以下的功能: 1 在程序中设置断点,当程序运行到断点处暂停 2 显示变量的值,可以打印或者监视某个变量,将某个变量的值显 ...
- linux应用程序设计--GDB调试
GDB简介:GDB是GNU发布的一款功能强大的程序调试工具,GDB主要完成下面三个方面功能: 一.GDB的使用操作 1.启动被调试程序. 2.让被调试的程序在指定的位置停住. 3.当程序被停住时,可以 ...
- Linux下用gdb 调试、查看代码堆栈
Linux中用gdb 查看代码堆栈的信息 core dump 一般是在segmentation fault(段错误)的情况下产生的文件,需要通过ulimit来设置才会得到的. 调试的话输入: gd ...
- linux基础2——gdb调试器
gdb调试器使用的一般步骤(不断更新完善): 1.编译过程中要用-g参数来添加调试符号——gcc test.c -g: 2.gdb启动可执行文件——gdb a.out: 3.出现gdb符号表示启动成功 ...
- NOI Linux下Emacs && gdb调试方法
1. 首先要配置emacs文件: (global-linum-mode t) (show-paren-mode t) (global-set-key (kbd "C-s") 'sa ...
- Linux系统下GDB调试
GDB 一.gdb常用命令: 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 in ...
- Linux基础(03)gdb调试
1. 安装GDB增强工具 (gef) * GDB的版本大于7.7 * wget -q -O- https://github.com/hugsy/gef/raw/master/scripts/gef.s ...
- 深度学习的GDB调试命令和经验记录
调试的指令很简单: cd $CAFFE_ROOT, 1. gdb ./build/tools/caffe 2. 设置运行参数 set args train --solver=xxxxsolver.pr ...
随机推荐
- ARPU_百度百科
ARPU_百度百科 ARPU
- Performance Tuning guide 翻译 || Performance Tuning Guide 11G中新增特性
CSDN 对格式支持比較弱.能够到http://user.qzone.qq.com/88285879/blog/1399382878 看一致的内容. Performance Tuning Guide ...
- img 的 align 属性
AbsBottom 图像的下边缘与同一行中最大元素的下边缘对齐. AbsMiddle 图像的中间与同一行中最大元素的中间对齐. Baseline 图像的下边缘与第一行文本的下边缘对齐. Bottom ...
- POJ 3384 Feng Shui 凸包直径 + 半平面交
G++一直没有过了 换成 C++果断A掉了...It's time to bet RP. 题意:给一个多边形,然后放进去两个圆,让两个圆的覆盖面积尽量最大,输出两个圆心的坐标. 思路:将多边形的边向里 ...
- 我的Python成长之路---第四天---Python基础(16)---2016年1月23日(寒风刺骨)
四.正则表达式 字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和 ...
- JVM 重排序
在java代码到最终执行的指令序列的整个过程中,会出现重排序.也就是说最终执行的顺序并不是按照源代码执行的顺序来进行的. 其中1为编译器的优化重排序,2,3是处理器的重排序. 数据依赖 如果两个操作访 ...
- Java NIO--初步认识
: 一.java NIO 和阻塞I/O的区别 1. 阻塞I/O通信模型 2. java NIO原理及通信模型 二.java NIO服务端和客户端代码实现 一.java NIO 和阻 ...
- Chapter 11 迪米特法则
迪米特法则也叫最少知识原则:如果两个类不必彼此直接通信,那么这两个类就不应当发生直接的相互作用.如果其中一个类需要调用另一个类的某一个方法的话,可以通过第三者转发这个调用. 迪米特法则首先强调的前提是 ...
- MFC全局函数开局——AfxGetApp解剖
MFC中有不少的全局函数,方便在不同对象中获取不同的内容或创建不同的对象.主要全局函数有: AfxWinInit() AfxBeginThread() AfxEndThread() AfxFormat ...
- CAN总线基础
can总线协议: 涵盖了OSI规定的传输层.数据链路层.物理层 物理层: 决定了位编码方式(NRZ编码,6个位插入填充位),位时序(位时序.位的采样).同步方式(根据同步段ss实现同步,并具有再同步功 ...