用gdb调试程序(Linux环境)
一般来说,GDB主要帮忙你完成下面四个方面的功能:
1、启动你的程序,可以按照你的自定义的要求随心所欲的运行程序。
2、可让被调试的程序在你所指定的调置的断点处停住。(断点可以是条件表达式)
3、当程序被停住时,可以检查此时你的程序中所发生的事。
4、动态的改变你程序的执行环境。
GDB can do four main kinds of things (plus other things in support of these) to help you catch bugs in the act:
(参考:Debugging with GDB https://sourceware.org/gdb/current/onlinedocs/gdb/)
- Start your program, specifying anything that might affect its behavior.
- Make your program stop on specified conditions.
- Examine what has happened, when your program has stopped.
- Change things in your program, so you can experiment with correcting the effects of one bug and go on to learn about another.
一个调试示例:
1、源程序:tst.c
#include <stdio.h> int func(int n)
{
int sum=,i;
for(i=; i<n; i++)
{
sum+=i;
}
return sum;
} int main()
{
int i;
long result = ;
for(i=; i<=; i++)
{
result += i;
} printf("result[1-100] = %ld /n", result );
printf("result[1-250] = %d /n", func() );
}
2、 编译生成执行文件:#gcc -g tst.c -o tst
3、启用GDB调试程序
4、#gdb tst //启动gdb,进入gdb调试环境
5、(gdb)list //list命令 从第一行开始列出源码
sum+=i;
}
return sum;
} int main()
{
int i;
long result = ;
6、(gdb) //直接回车,表示执行上一条命令
for(i=; i<=; i++)
{
result += i;
} printf("result[1-100] = %ld /n", result );
printf("result[1-250] = %d /n", func() );
}
7、(gdb) //直接回车,表示执行上一条命令
Line number out of range; tst.c has lines.
8、(gdb) break 16 //在源程序tst.c第16行设置断点
Breakpoint at 0x400563: file tst.c, line .
9、(gdb)break func //在源程序中函数func()的入口处设置断点,断点在第5行
Breakpoint at 0x400534: file tst.c, line .
10、(gdb)info break //查看断点信息
Num Type Disp Enb Address What
breakpoint keep y 0x0000000000400563 in main at tst.c:
breakpoint keep y 0x0000000000400534 in func at tst.c:
11、(gdb)r //输入r,r是run命令的简写
Starting program: /root/c_study/tst Breakpoint , main () at tst.c:
long result = ;
Missing separate debuginfos, use: debuginfo-install glibc-2.17-.el7_4..x86_64
12、(gdb)n //输入n,n是next命令的简写,next命令:执行下一条程序
for(i=; i<=; i++)
13、(gdb)n
result += i;
14、(gdb)n
for(i=; i<=; i++)
15、(gdb)n
result += i;
用gdb调试程序(Linux环境)的更多相关文章
- 针对 Linux 环境下 gdb 动态调试获取的局部变量地址与直接运行程序时不一致问题的解决方案
基础的缓冲区溢出实践通常需要确定运行状态下程序中的某些局部变量的地址,如需要确定输入缓冲区的起始地址从而获得注入缓冲区中的机器指令的起始地址等.在 Linux 环境下,可通过 gdb 对程序进行动态调 ...
- Linux高级编程--04.GDB调试程序(入门概述)
GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试 ...
- Linux环境下使用gcc编译,gdb反汇编C语言程序
使用虚拟机 VMware Workstation 10 Linux环境:Ubuntu 14.04 LTS Server amd64 我把过程截图如下. 首先是hello world程序: 备注: ...
- Linux高级编程--04.GDB调试程序(查看数据)
查看栈信息 当程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的.当你的程序调用了一个函数,函数的地址,函数参数,函数内的局部变量都会被压入"栈"(Stack)中.你可以用 ...
- Linux下使用GDB调试程序
问题描述: Linux下使用GDB调试程序 问题解决: (1)生成调试文件 注: 使用命令 gdb IOStream.c -o IOStre ...
- 在qemu环境中用gdb调试Linux内核
简介 对用户态进程,利用gdb调试代码是很方便的手段.而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试.其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qem ...
- 利用QEMU+GDB搭建Linux内核调试环境
前言 对用户态进程,利用gdb调试代码是很方便的手段.而对于内核态的问题,可以利用crash等工具基于coredump文件进行调试. 其实我们也可以利用一些手段对Linux内核代码进行gdb调试,qe ...
- Linux环境下段错误的产生原因及调试方法小结(转)
最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且 项目工程庞大复杂,出现了不少问题,其中遇到最多.花费时间最长的问题就是著名的“段错误”(Segmentation F ...
- 用GDB调试程序(一)
http://blog.csdn.net/haoel/article/details/2879 用GDB调试程序 GDB概述———— GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或 ...
随机推荐
- SDOI2018 一轮培训划水祭
\(\mathcal{Day \ \ -3}\) 作为前言来讲,我对于过几天的省选培训还是很期待的--就算我的实力根本不够,名额是学校推荐的,但是能见到\(\mathcal{cwbc}\)以及一众大佬 ...
- LOG算子
原文:http://blog.csdn.net/songzitea/article/details/12851079 背景引言 在博文差分近似图像导数算子之Laplace算子中,我们提到Laplace ...
- jQuery 表单元素取值与赋值方法总结
一.普通文本框的赋值与取值 1.1.1赋值 <h2>jQuery 表单元素取值与赋值方法总结</h2> <input type="text" clas ...
- ./redis-trib.rb 报错:/usr/local/rvm/gems/ruby-2.4.2/gems/redis-4.0.1/lib/redis/client.rb:119:in `call': ERR Slot 0 is already busy (Redis::CommandError)
错误提示是 slot插槽被占用了(这是 搭建集群前时,以前redis的旧数据和配置信息没有清理干净.) 解决方案是 用redis-cli 登录到每个节点执行 flushall 和 cluster ...
- ionic3 返回多个页面的写法
直接上代码 ionic3 返回2步 3步 或者多部 this.navCtrl.popTo(this.navCtrl.getByIndex(this.navCtrl.length()-3)); ...
- Ubuntu18.04挂载exfat格式移动硬盘
1.安装exfat-fuse 命令:sudo apt-get install exfat-fuse 2.重新插拔移动硬盘,即可识别 查看挂载命令:lsblk
- python 用户注册用户名
实现用户注册网站,编辑用户名时判断是否已经存在: 若存在则提示“The name you used have already existed,please change your name” 若不存在 ...
- 每天一个linux命令(1):find命令之exec
ind是我们很常用的一个Linux命令,但是我们一般查找出来的并不仅仅是看看而已,还会有进一步的操作,这个时候exec的作用就显现出来了. exec解释:-exec 参数后面跟的是command命令, ...
- ssm多数据源的操作
公司要求,需要使用两个数据库,一个mysql,一个oracle.所以需要配置两个数据库来进行操作. 1.首先,需要在jdbc.properties文件中将两个库的配置数据写入,不过一个写driver, ...
- jQuery实现页面回到顶部功能
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...