Linux应用的调试GDB使用方法GDB常用命令
Linux命令高级技巧使用gdb命令进行程序的调试与分析

Linux命令高级技巧使用gdb命令进行程序的调试与分析在Linux环境下,gdb(GNU调试器)是一个非常强大的工具,用于调试和分析程序的运行。
它提供了丰富的功能,能够帮助开发人员定位和解决程序中的错误。
本文将介绍一些使用gdb命令进行程序调试与分析的高级技巧。
一、安装gdb命令若系统中尚未安装gdb命令,可以通过以下方式安装:1. 打开终端窗口2. 输入命令“sudo apt-get install gdb”并按下回车键3. 输入用户密码并按下回车键4. 等待安装完成二、使用gdb调试程序调试程序是开发过程中非常重要的一环。
gdb提供了各种功能,可以帮助开发人员追踪代码的执行,查找变量的值,以及定位程序中的错误。
下面介绍一些常用的调试命令:1. 启动gdb调试使用命令“gdb <可执行文件>”启动gdb调试器,其中<可执行文件>是需要调试的程序的路径和文件名。
2. 设置断点在需要设置断点的代码行前面输入“break”命令,例如“break main”,即可在main函数入口处设置断点。
使用命令“info breakpoints”可以查看已设置的断点。
3. 运行程序输入“run”命令,即可开始运行程序。
程序运行到断点处会自动停止,等待用户进行调试操作。
4. 单步执行输入“next”命令可逐行执行程序,遇到函数调用时会直接跳过,并进入下一行。
若想进入函数内部进行调试,使用“step”命令。
5. 查看变量值使用“print <变量名>”命令可以查看变量的值,例如“print num”即可查看名为num的变量的值。
6. 修改变量值输入“set <变量名>=<新值>”命令可以修改变量的值,例如“setnum=10”即可将名为num的变量的值修改为10。
7. 继续执行使用“continue”命令可以让程序继续执行,直到遇到下一个断点或程序结束。
Linux下GNU调试器gdb详细说明

Linux下GNU调试器gdb详细说明1.简介Linux下GNU 的调试器称为 gdb,该程序是一个交互式工具,工作在字符模式。
在 X Window 系统中,有一个 gdb 的前端图形工具,称为 xxgdb。
gdb 是功能强大的调试程序,可完成如下的调试任务:* 设置断点;* 监视程序变量的值;* 程序的单步执行;* 修改变量的值。
在可以使用gdb 调试程序之前,必须使用-g 选项编译源文件。
可在 makefile 中如下定义CFLAGS 变量:CFLAGS = -g运行 gdb 调试程序时通常使用如下的命令:gdb progname在 gdb 提示符处键入help,将列出命令的分类,主要的分类有:* aliases:命令别名* breakpoints:断点定义;* data:数据查看;* files:指定并查看文件;* internals:维护命令;* running:程序执行;* stack:调用栈查看;* statu:状态查看;* tracepoints:跟踪程序执行。
键入 help 后跟命令的分类名,可获得该类命令的详细清单。
2.gdb 的常用命令表 1-4 常用的 gdb 命令命令解释break NUM 在指定的行上设置断点。
bt 显示所有的调用栈帧。
该命令可用来显示函数的调用顺序。
clear 删除设置在特定源文件、特定行上的断点。
其用法为:clear FILENAME:NUM。
continue 继续执行正在调试的程序。
该命令用在程序由于处理信号或断点而导致停止运行时。
display EXPR 每次程序停止后显示表达式的值。
表达式由程序定义的变量组成。
file FILE 装载指定的可执行文件进行调试。
help NAME 显示指定命令的帮助信息。
info break 显示当前断点清单,包括到达断点处的次数等。
info files 显示被调试文件的详细信息。
info func 显示所有的函数名称。
Linux中gdb调试程序

常用gdb命令列表命令标志命令命令描述file prog 载入prog可执行文件,为调试做准备kill 终止正在调试的进程list 显示正在调试程序的部分源代码next 从当前执行代码出,执行下一行代码(如果当前行是函数调用,该命令不会进入函数)step 跟踪到函数内容执行一行代码(如果当前行是函数调用,gdb会进入该函数运行;不过该函数必须包含调试信息)run 从头执行当前被调试的程序continue 持续执行到下一个断点quit退出gdb调试环境watch 监视一个变量的值,每单步执行一步,gdb都会显示该变量的当前值break ARGS tbreak ARGS hbreak ARGS thbreak ARGS rbreak REGEXP 设置断点(break),当程序执行到断点时将被挂起。
tbreak为临时断点,一次有效,断点完毕将被删除。
hbreak为硬件中断断点。
thbreak为硬件临时断点。
rbreak为正则表达式断点,匹配该表达式的所有函数将被中断break main 在main函数入口设置断点break SampleChildClass::PrintMe在类的成员函数断点break foo(int) 对于不同的重载函数设置断点break foo(int,int)break :foo(int)对源文件某个函数或者某一行设置断点使用info breaks查看断点,使用enable/disable<Breakpoint Number>启用和禁用断点。
删除断点使用delete breakpoints<Breakpoint Number>util lineno 运行到lineno一行finish 运行到函数返回make 不退出gdb,对项目重新编译链接shell 不退出gdb,执行shell命令print 打印当前变量的值backtrace或bt 显示所有的调用栈帧,该命令可用来显示函数的调用顺序info break 显示当前断点清单,包括到达断点处的次数等info files 显示被调试文件的详细信息info func 显示所有的函数名称info local 显示当前函数中的局部变量信息info prog 显示被调试工具的执行状态info var 显示所有的全局和静态变量名称gdb程序的调试过程如下:1、生成调试文件为了生成调试信息,用户无论使用gcc,g++或者cc编译器都必须在编译时使用-g参数,这样在调试的时候才能看到对应的源程序代码。
GDB常用指令

GDB常用指令——linux 操作系统实验在做操作系统实验时,需要运用GDB进行调试程序,现将一些常用的指令汇总如下。
点停止下来后,就执行命令,命令要以end结束,例如:显示rip之后的5条指令汇编指令,例如再用gdb分析C程序的函数调用时,需要了解C程序传输传递的一些约定规则。
参数传递,当被调用函数的参数小于或者等于6个时,参数传递只使用寄存器,不使用栈来传递参数,当被调用函数参数大于6个时,多于6个的参数将使用栈来传递。
其中第一至第六个参数对应的寄存器是%rdi,%rsi,%rdx,%rcx,%r8,%r9。
另外这6个寄存器的宽度会根据参数类型来改变,例如如果参数1是64 bits,就对应%rdi,如果是32 bits就对应%edi,16 bits 对应%di,8 bits 对应%dil。
此外%r8和%r9,是x64 CPU所特有的,以%r8为例,32bits 对应%r8d,16bits 对应%r8w,8bits 对应%r8b。
函数过程中寄存器修改规则,寄存器%rbx、%rbp、%r12、%r13、%r14、和%r15是被调用者保存寄存器,当过程P调用过程Q时,Q必须保持这些寄存器的值,也就是在Q开始运行到Q返回这个,过程中,这些值保持不变,换句话说,就是P调用完Q后,这些寄存器的值就是P 放在里面的值,在Q运行的过程中,如果要使用这些寄存器,就必须要先保存这些寄存器的原值,在Q返回之前,要将原值返回到寄存器中。
除去%rsp寄存器之外的所有其他寄存器是调用者保存寄存器,所有被调用者都可以修改这些寄存器的值,在之前,不用加以保护,也就是说,P在调用Q之前,由于Q可以随意的修改这些寄存器值,如果P需要在调用完Q后,需要继续寄存器中的当前值,那么P就需要在调用Q之前,将这些值加以保护——放入栈中。
在从Q返回后,再将这些值返回到寄存器中。
此外再用栈来传递参数时,参数从右向左逐个入栈的。
[Linux学习gdb调试教程]
![[Linux学习gdb调试教程]](https://img.taocdn.com/s3/m/332c01fdfbb069dc5022aaea998fcc22bcd14318.png)
There is NO WARRANTY, to the extent permitted by law. Type
不应该怀疑代码而应该怀疑数据,因为第一次和第二次运行的都是同一段 "show copying"
代码,如果代码是错的,那为什么第一次的结果能对呢?然而第一次和第
and "show warranty" for details.
files -- Specifying and examining files
to "word".
internals -- Maintenance commands
Command name abbreviations are allowed if unambiguous.
在编译时要加上-g 选项,生成的可执行文件才能用 gdb 进行源码级 件中第几条机器指令对应源代码的第几行,但并不是把整个源文件嵌入到
调试:
可执行文件中,所以在调试时必须保证 gdb 能找到源文件。gdb 提供一个
第 2 页 共 10 页
本文格式为 Word 版,下载可任意编辑,页眉双击删除即可。
第一个结果正确[20],第二个结果显然不正确,在小学我们就听说过
This is free software: you are free to ch的故事,从 1 加到 100 应该是 5050。一段代码,第一次运行 it.
结果是对的,第二次运行却不对,这是很常见的一类错误现象,这种情况
#include <stdio.h> int add_range(int low, int high) { int i, sum; for (i = low; i <= high; i++) sum = sum + i; return sum; } int main(void) { int result[100]; result[0] = add_range(1, 10); result[1] = add_range(1, 100); printf("result[0]=%d\nresult[1]=%d\n", result[0], result[1]); return 0;
Linux应用调试使用gdb和gdbserver命令详解

Linux应⽤调试使⽤gdb和gdbserver命令详解1.gdb和gdbserver调试原理通过linux虚拟机⾥的gdb,来向开发板⾥的gdbserver发送命令,⽐如设置断点,运⾏setp等,然后开发板上的gdbserver收到命令后,便会执⾏应⽤程序做相应的动作,来实现调试的功能和之前学的裸板GDB调试⼀样,只不过之前学的是在win下的,本次是在linux⾥的gdb1.1同样,它们都会需要⼀个带调试信息的编译⽂件.通过Makefile⾥的arm-linux-gcc -g 来的, -g:表⽰编译⽂件⾥包含gdb调试信息1.2为什么需要调试信息的编译⽂件?⽐如读开发板的应⽤程序⾥的变量a:⾸先gdb通过应⽤程序的带调试信息的编译⽂件,来找出变量a存的地址位置然后将地址发送给开发板⾥的gdbserver,来读出a地址的值2.安装gdb和gdbserver2.1在虚拟机上安装GDB: # tar xjf gdb-7.4.tar.bz2 //解压# cd gdb-7.4/ //进⼊gdb-7.4⽬录#./configure --target=arm-linux//GDB需要在pc本机⾥运⾏,并调试开发板⾥的应⽤程序,所以--target设为arm-linux#make //编译#mkdir tmp#make install prefix=$PWD/tmp //安装到./tmp⽬录下sudo cp tmp/bin/arm-linux-gdb /bin/ //复制到/bin⽬录下/bin/arm-linux-gdb -v //-v: 确定⼀下gdb的版本VID,是否是7.42.2 在开发板上安装GDBServer:cd gdb/gdbserver/ //在gdb-7.4⽬录下输⼊./configure --target=arm-linux --host=arm-linux //设GDBServer的⼯作环境make //编译出现以下错误:指在linux-arm-low.c⾥,没有找到PTRACE_GETSIGINFO 定义2.3 解决:1)#echo $PATH //来查看PATH环境变量找到编译器gcc位于/work/tools/gcc-3.4.5-glibc-2.3.6/bin2)#cd /work/tools/gcc-3.4.5-glibc-2.3.6/ # grep "PTRACE_GETSIGINFO" * -nR在gcc根⽬录下,搜索到在linux/ptrace.h中定义:3)#vi linux-arm-low.c添加: #define PTRACE_GETSIGINFO 0x42024)最后重新make,⽣成gdbserver命令⽂件然后将gdbserver命令⽂件,放⼊我们开发板的根⽬录/bin中,便能使⽤了cp gdbserver /nfs_root/bin/ //nfs_root:开发板的nfs系统根⽬录3.测试程序如下(test_debug.c)#include <stdio.h>void C(int *p){ *p = 0x12;}void B(int *p){ C(p);}void A(int *p){ B(p);}void A2(int *p){ C(p);}int main(int argc, char **argv){ int a; int *p = NULL; A2(&a); // A2 > C printf("a = 0x%x\n", a); A(p); // A > B > C return 0;}其中A2(&a)会调⽤A2()->C(),然后将a赋值为0x12.A(p)会调⽤A()->B()->C(),由于p是个空指针,这⾥将会出错.接下来,我们便以这个应⽤程序为例.4.编译#arm-linux-gcc -g -o test_debug test_debug.c //-g:附带调试信息5.调试test_debug.c在开发板上:⾸先,需要让gdbserver建⽴本地服务器,以及要测试的哪个⽂件:#gdbserver 192.168.2.107:2345 ./test_debug//192.168.2.107:本地IP地址//2345:端⼝号,⽤来让gdb来连接⽤的//./test_debug:要测试的哪个⽂件在虚拟机上:#/bin/arm-linux-gdb ./test_debug // 启动gdb,指定调试⽂件为test_debug#target remote 192.168.2.107:2345 //与gdbserver建⽴连接5.1连接成功,便使⽤gdb命令来调试列出所有源代码break [file]:[row]打断点,⽐如:break test_debug.c:21 //在test_debug.c⽂件的第21⾏处打断点info br查看断点info file列出当前的⽂件,共享库。
linux gdb调试指令 linux下gdb常用的调试指令

u 内存单位(b: 1 字节; h: 2 字节; w: 4 字节; g: 8 字节)
set print address on
set vairiable a = 100 可以修改变量的值
打开地址输出,当程序显示函数信息时,GDB 会显出函数的参数地址。
commands 指定到了特定断点后is buf 显示变量的类型
set print object <on/off>
dump memory 输出文件名 内存起始地址 内存终止地址
在 C++中,如果一个对象指针指向其派生类,如果打开这个选项,GDB
restore 文件名 binary 起始位置
会自动按照虚方法调用的规则显示输出,如果关闭这个选项的话,GDB 就
delete 删除断点 d 3 删除指定的断点 condition 修改条件 condition 4 a == 90 info 查看信息 info threads 查看线程信息 info breakpoints 查看断点信息 info locals 显示局部变量 info args 显示函数变量 info registers 显示寄存器数据 thread 2 切换线程 where 查看调用堆栈(bt 或者 info s)
set print elements 0 默认这里设置是 200,设置为 0 表示没有限
x/nfu 0×300098 显示指定地址的内存数据
制
n 显示内存单位,长度
还有其它一些 set 命令可以试试:
f 格式(除了 print 格式外,还有 字符串 s 和 汇编 i)
set print address
break 设置断点 b main 设置函数断点 b 9 设置指定行断点 b 将下一行设置为断点 b test if a == 10 设置条件断点
用GDB调试程序--调试器GDB常用功能

一,GDB调试器简介GDB是Linux下的常用调试器,主要用于调试源代码、调试运行中的进程和查看core dump文件。
Linux下的调试器主要有gdb、cgdb、ddd、eclipse。
GDB调试器的运行速度快、能够进行源代码同步显示。
使用-tui 选项开启gdb命令输入和源代码的分屏显示,tui即Terminal User Interface。
二,GDB常用调试命令a)调试可执行文件以源代码为/home/zebra/目录下的test.c文件产生的可执行文件test为例(可执行文件使用gcc进行编译,并使用-g选项以产生调试信息),进行命令的说明(详细源代码参见第三部分:三,调试实例分析 )。
gdb调试源代码流程:1,开启gdb程序,即运行如下命令:gdb -q (-q用以使得gdb不输出gdb程序的版本等信息)2,指定调试的二进制文件:file test3,list查看源代码4,设定断点breakpoint mainbreakpoint sub上述分别在main函数和sub函数处设定了断点。
断点可以设置在任意已知源代码文件的某一行,某一个函数,同时可以指定是设置在哪个/哪些线程上(见下边描述)。
5,运行可执行文件:run6,这样程序会运行到断点处停止下来,gdb会打印当前断点的信息。
7,使用s 或者n进行单步调试。
s即step,n即next都是执行一条语句,然后停下来。
如果想执行一条汇编语句,则可以使用si ,ni,即step instruction,next instruction。
8,bt命令查看当前的调用栈,bt即backtrace。
9,info frame查看函数帧信息。
10,frame n 进入某个函数帧(编号为n)11,info 命令可以对当前的函数帧的寄存器、局部变量、函数的参数进行查看。
info register;info local;info args。
12,disassemble对当前函数对应的二进制进行反汇编。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
调试演示
1. 使用gcc命令进行编译(务必需要-g选项) gcc –g –o buffer buffer.c 2. 启动gdb进行调试 gdb buffer 3. 使用run命令运行程序 r (or run) 4. 根据逻辑找出问题,可附加使用list查看 代码 l (or list)
目录
调试概述 GDB简介 调试演示 课程实践
调试演示
char * readString(void) { int nextInChar; int nextLocation;
printf("Input> "); nextLocation = 0; while ((nextInChar = getchar()) != '\n' && nextInChar != EOF) { Buffer[nextLocation++] = nextInChar; } return Buffer;
}
调试演示
#define MAXLINE_LENGTH 80 char Buffer[MAXLINE_LENGTH]; char * readString(void) { int nextInChar; int nextLocation; printf("Input> "); nextLocation = 0; while ((nextInChar = getchar()) != '\n' && nextInChar != EOF) { Buffer[nextLocation++] = nextInChar; } return Buffer; }
Lecturer: xxx Assistant:xx 4st @ 2011-03-22 xxxxx
目录
调试概述 GDB简介 调试演示 课程实践
目录
调试概述 GDB简介 调试演示 课程实践
调试概述Βιβλιοθήκη 1/2What is debug?
调试,是发现和减少计算机程序或电子仪器设 备中程序错误的一个过程
课程实践
使用gdb调试以下程序代码 1. 对出现出错信息的部分进行截图 2. 修改完善源代码 3. 使用gdb调试修改后的代码,给出错误 修改后部分的调试截图(与原图对比) 4. 说明程序出现错误的原因以及解决方法
课程实践
#include <stdio.h> #include <unistd.h> #define ARRAY_SIZE 10 void natural_numbers (void) { int i; int array[ARRAY_SIZE]; i = 1; while (i <= ARRAY_SIZE) { array[i] = i - 1; sleep(1); /* print slowly to see clearly */ printf("array[%d] = %d\n", i, array[i]); i = i + 1; } }
enable breakpoint 断点号:允许指定的断点
GDB的常用命令
3/4
程序的控制指令
run:程序开始执行,一直运行到断点才终止; continue:运行到下一个断点; next:运行下一条指令; step:运行下一条指令;
GDB的常用命令
4/4
调试演示
10. 使用bt命令查看栈信息 11. 使用info b (or break)查看断点信息 12. 使用delete或者clear命令清除断点 13. kill杀死当前正在调试的程序进程 14. 使用quit命令推出gdb调试环境
目录
调试概述 GDB简介 调试演示 课程实践
它使你能监视你程序中变量的值. 它使你能设置断点以使程序在指定的代码行
上停止执行. 它使你能一行行的执行你的代码.
GDB的使用方法
GDB的命令格式
gdb [option] [executable-file[core-file or
process-id]]
GDB的常用命令
1/4
调试演示
5. 使用break命令设置断点
b (or break) lineNumber or functionName
6. 使用run命令运行程序 r (or run) 7. 使用watch命令指定需要跟踪的变量 watch Buffer 8. 按照终端提示输入input字符串,其他gdb 模式下输入n (or next)或者回车继续执行 9. 重复8,找出症结所在
○ 程序安装网址:
/software/gdb/download
编译时加上-g选项
目录
调试概述 GDB简介 调试演示 课程实践
GDB简介
GDB的概述 GDB的使用方法 GDB常用命令
GDB的概述
Gdb是一款GNU开发组织并发布的 UNIX/Linux下的程序调试工具。它使你 能在程序运行时观察程序的内部结构和内 存的使用情况. 以下是gdb 所提供的一些 功能:
加载和退出命令
gdb filename:在shell下直接加载文件进行调
试 file filename:在gdb下通过file命令加载程序进 行调试 kill:终止正在调试的程序 quit:退出gdb调试环境
GDB的常用命令
2/4
断点控制
break 函数名或行号[if 条件] Info break :显示程序中设置的断点; delete breakpoint 断点号:删除指定的断点 clear 断点号:作用同上 disable breakpoint 断点号:禁用指定的断点
变量、参数的设置与查看 • list:列出产生执行文件的源代码的一部分. • watch 变量名:当变量改变时,显示变量 修改前后的值; • print 变量名:打印变量值; • whatis 变量名或函数名:显示变量或函数 的类型; • Ptype:显示数据结构的定义; • set args:设置程序的运行参数; • Show args:显示程序的运行参数;
Why debug?
软件开发的一个很重要的工作是测试程序和排
除错误。特别是在一个大程序中,编程错误是 不可避免的。程序可能会返回错误的结果,因 为无穷循环而死机,甚至因为内存操作不当导 致系统崩溃。因此需要通过调试来找到这些错 误并消灭它们~
调试概述
2/2
调试前提
安装GDB软件包 ○ 程序参考手册网址: /software/gdb/documention