Linux下GDB调试简单示例
这里介绍对文件first.c的基本GDB调试操作,只有部分命令,只是一个示例,运行环境为装有gcc编译器和gdb调试器的Linux环境,基本GDB调试命令如下表:
命令 描述
backtrace(或bt) 查看各级函数调用及参数
finish 连续运行到当前函数返回为止,然后停下来等待命令
frame(或f) 帧编号 选择栈帧
info(或i) locals 查看当前栈帧局部变量的值
list(或l) 列出源代码,接着上次的位置往下列,每次列10行
list 行号 列出从第几行开始的源代码
list 函数名 列出某个函数的源代码
next(或n) 执行下一行语句
print(或p) 打印表达式的值,通过表达式可以修改变量的值或者调用函数
set var 修改变量的值
start 开始执行程序,停在main函数第一行语句前面等待命令
step(或s) 执行下一行语句,单步调试用这个
x 查看变量内存
b 后面加行号表示在该行打断点
c 继续运行到下一个断点
r 运行
quit 退出调试
vi 后面加文件名可以打开文件用vim进行编辑
disass (/m) main 查看main函数的汇编
以下是示例的全过程:
[LLL@localhost LLL]$ cd test //到目标目录
[LLL@localhost test]$ ls
first.c server.c sock.c
[LLL@localhost test]$ cat first.c //查看first.c内容
#include <stdio.h> int add(int m, int n)
{
int result;
m = 10*m;
n = 100*n;
result = m+n;
return result;
} int main()
{
int a = 10;
int b = 100;
int i = 0;
printf("%d",i);
i = add(a,b);
b = add(b,a);
printf("%d %d %d",a,b,i);
return 0;
}
[LLL@localhost test]$ gcc -g first.c -o first //gcc 编译
[LLL@localhost test]$ ls
first first.c server.c sock.c
[LLL@localhost test]$ ./first //运行目标文件
010 2000 10100[LLL@localhost test]$ ls
first first.c server.c sock.c
[LLL@localhost test]$ vi first.c //由于运行看出没有换行,因此用vim编辑修改,打印中加入了换行
[LLL@localhost test]$ rm -f first
[LLL@localhost test]$ ls
first.c server.c sock.c
[LLL@localhost test]$ gcc -g first.c -o first
[LLL@localhost test]$ ./first //换行后的结果
0
10 2000 10100
[LLL@localhost test]$ gdb first //启动GDB调试
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-100.el7
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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /data/ManyCore/software/LLL/test/first...done.
(gdb) l //列出内容
5 int result;
6 m = 10*m;
7 n = 100*n;
8 result = m+n;
9 return result;
10 }
11
12 int main()
13 {
14 int a = 10;
(gdb) //Enter翻页
15 int b = 100;
16 int i = 0;
17 printf("%d\n",i);
18 i = add(a,b);
19 b = add(b,a);
20 printf("%d %d %d\n",a,b,i);
21 return 0;
22 }
(gdb) b 17 //在17行打断点
Breakpoint 1 at 0x40057c: file first.c, line 17.
(gdb) start //开始运行程序
Temporary breakpoint 2 at 0x400567: file first.c, line 14.
Starting program: /data/ManyCore/software/LLL/test/first
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1". Temporary breakpoint 2, main () at first.c:14
14 int a = 10; //进入main函数的首行
Missing separate debuginfos, use: debuginfo-install glibc-2.17-196.el7_4.2.x86_64
(gdb) n //下一步,遇到子函数不进入,当做一行执行
15 int b = 100;
(gdb) s //下一步,s可以进入子函数
16 int i = 0;
(gdb) s Breakpoint 1, main () at first.c:17
17 printf("%d\n",i);
(gdb) s
0
18 i = add(a,b);
(gdb) b 6 //在6行打断点
Breakpoint 3 at 0x400537: file first.c, line 6.
(gdb) c //运行到下一个断点
Continuing. Breakpoint 3, add (m=10, n=100) at first.c:6
6 m = 10*m;
(gdb) c
Continuing. Breakpoint 3, add (m=100, n=10) at first.c:6
6 m = 10*m;
(gdb) i locals //查看当栈帧中的局部变量(这里的add函数)
result = 10100
(gdb) s
7 n = 100*n;
(gdb) s
8 result = m+n;
(gdb) s
9 return result;
(gdb) s
10 }
(gdb) s
main () at first.c:20
20 printf("%d %d %d\n",a,b,i);
(gdb) i locals //查看当栈帧中的局部变量(这里的main函数)
a = 10
b = 2000
i = 10100
(gdb) p a //查看变量
$1 = 10
(gdb) p b
$2 = 2000
(gdb) p &a //查看变量的地址
$3 = (int *) 0x7fffffffe3cc
(gdb) x 0x7ffffffe3cc
0x7ffffffe3cc: Cannot access memory at address 0x7ffffffe3cc
(gdb) x 0x7fffffffe3cc //查看内存的值
0x7fffffffe3cc: 0x0000000a
(gdb) r //运行程序
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /data/ManyCore/software/LLL/test/first
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib64/libthread_db.so.1". Breakpoint 1, main () at first.c:17
17 printf("%d\n",i);
(gdb) c
Continuing.
0 Breakpoint 3, add (m=10, n=100) at first.c:6
6 m = 10*m;
(gdb) c
Continuing. Breakpoint 3, add (m=100, n=10) at first.c:6
6 m = 10*m;
(gdb) c
Continuing.
10 2000 10100
[Inferior 1 (process 118146) exited normally]
(gdb)
Linux下GDB调试简单示例的更多相关文章
- Linux知识(5)----LINUX下GDB调试
命令 解释 示例 file 加载被调试的可执行程序文件.因为一般都在被调试程序所在目录下执行GDB,因而文本名不需要带路径. (gdb) file gdb-sample r c Run的简 ...
- 一文入门Linux下gdb调试(二)
作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的 ...
- 一文入门Linux下gdb调试(一)
作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述 在window下我们习惯了IDE的各种调试按钮,说实话确实挺方便的,但到了Linux下,没有那么多的IDE ...
- Linux下GDB调试
GDB 是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行 序列,形成脚本.UNIX 下的软件全是命令行的,这给程序开发提供了极大的便利,命令行 软件的优势在于, 他们可以非常容 ...
- Linux下gdb调试(tui)
1 处于TUI模式的GDB 为了以TUI模式运行GDB,可以在调用GDB时在命令行上指定-tui选项,或者处于非TUI模式时在GDB中使用Ctrl+X+A组合键.如果当前处于TUI模式,后一种命令方式 ...
- Linux下GDB调试C/C++
首先先编译程序并生成调试符号: gcc -g -c main.cpp gcc -o exefile main.o 以上的exefile为可执行程序的文件名 然后: gdb exefile 可以开始gd ...
- (十五)linux下gdb调试
一.gdb常用命令: 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 frame(或f) 帧编号 选择栈帧 info(或 ...
- linux下gdb调试方法与技巧整理
参考博客: https://blog.csdn.net/niyaozuozuihao/article/details/91802994 1.运行命令run:简记为 r ,其作用是运行程序,当遇到断点 ...
- 25. Linux下gdb调试
1.什么是core文件?有问题的程序运行后,产生"段错误 (核心已转储)"时生成的具有堆栈信息和调试信息的文件. 编译时需要加 -g 选项使程序生成调试信息: gcc -g cor ...
随机推荐
- hue中使用oozie的workflow执行mr
workflow创建任务 进入hue–Workflows–编辑器–workflow–创建 拖一个mapreduce作业(在页面靠近顶端有一排选项图标)到页面中间虚线框中 Jar路径必须是hdfs中ja ...
- 梯度下降(Gradient Descent)相关概念
梯度,直观理解: 梯度: 运算的对像是纯量,运算出来的结果会是向量在一个标量场中, 梯度的计算结果会是"在每个位置都算出一个向量,而这个向量的方向会是在任何一点上从其周围(极接近的周围,学过 ...
- 入坑机器学习?听听MIT在读博士的AI心得
随着人工智能技术的火热,越来越多的年轻学者正准备投身其中,开启自己的研究之路.和所有其他学科一样,人工智能领域的新人总会遇到各种各样的难题,其中不仅有研究上的,也有生活方面的.MIT EECS 在读博 ...
- CS229 3.用Normal Equation拟合Liner Regression模型
继续考虑Liner Regression的问题,把它写成如下的矩阵形式,然后即可得到θ的Normal Equation. Normal Equation: θ=(XTX)-1XTy 当X可逆时,(XT ...
- WPF Combobox选中事件
/// <summary> /// 选中事件 /// </summary> /// <param name="sender"></para ...
- 将16进制的颜色转为rgb颜色
在前端面试过程中,常常会遇到这样一种类型的题目: 使用js将16进制的颜色值转为rgb颜色! 反而在项目中,不怎么遇到这种问题,也很少有这种需求的项目. 但毕竟面试中常常遇到,我自己在之前的面试的时候 ...
- 【Linux】【Tomcat】Tomcat的安装和配置等
安装环境 :Linux(Ubuntu 版) 安装软件 : apache-tomcat-9.0.0.M1.tar.gz(下载地址http://tomcat.apache.org/) 步骤一 Tomcat ...
- 20165205 2017-2018-2 《Java程序设计》第六周学习总结
20165205 2017-2018-2 <Java程序设计>第六周学习总结 教材学习内容总结 String类 String对象(常量,对象) 字符串并置(结果仍是常量) 常用方法 len ...
- 禁用firefox 56自动更新
firefox 56支持旧式扩展,这很重要! 它却自动更新,简单地关了也不行,很是牛氓! ========== -备份C:\Users\用户名\AppData\Roaming\Mozilla\Fire ...
- Patrick Hughes - 错觉3D雕塑艺术
Pictures Patrick Hughes (artist) From Wikipedia, the free encyclopedia Patrick Hughes. Leaning on a ...