Linux应用的调试GDB使用方法GDB常用命令

合集下载

Linux命令高级技巧使用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详细说明

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调试程序

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常用指令

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调试教程]

There is NO WARRANTY, to the extent permitted by law. Type
不应该怀疑代码而应该怀疑数据,因为第一次和第二次运行的都是同一段 &quot;show copying&quot;
代码,如果代码是错的,那为什么第一次的结果能对呢?然而第一次和第
and &quot;show warranty&quot; for details.
files -- Specifying and examining files
to &quot;word&quot;.
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 &lt;stdio.h&gt; int add_range(int low, int high) { int i, sum; for (i = low; i &lt;= 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(&quot;result[0]=%d\nresult[1]=%d\n&quot;, result[0], result[1]); return 0;

Linux应用调试使用gdb和gdbserver命令详解

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常用的调试指令

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 &lt;on/off&gt;
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&times;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常用功能

一,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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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
相关文档
最新文档