GDB调试简易教程

合集下载

gdb交叉编译调试教程

gdb交叉编译调试教程

gdb交叉编译调试教程1.引言1.1 概述引言是一篇长文的开头部分,用于向读者介绍文章的背景、内容和目的。

在本篇长文中,我们介绍了gdb交叉编译调试的教程。

在本文的概述部分,我们将对文章的主要内容进行简要介绍。

本文主要分为引言、正文和结论三个部分。

在引言部分,我们首先介绍了本文的概述。

随后,我们会详细说明文章的结构和目的。

本文的主要目的是教会读者如何使用gdb进行交叉编译调试。

我们将从gdb的简介开始,介绍gdb的基本功能和用途。

然后,我们会对交叉编译进行概述,详细说明交叉编译的原理和常见的应用场景。

在结论部分,我们将对本文进行总结,并提供一些建议,帮助读者更好地进行实践。

通过本文的学习,读者将能够掌握gdb交叉编译调试的基本技巧,为软件开发和调试提供便利。

同时,读者也能够理解交叉编译的原理和应用,进一步提高自己的编程能力。

接下来,让我们开始正文的内容,详细介绍gdb的相关知识和交叉编译的实践操作。

文章结构部分的内容可以包括以下内容:文章结构指导读者对整篇文章的组织和内容有一个清晰的了解。

通过明确的结构,读者可以更好地理解和学习文章中的知识点。

下面是文章结构的主要部分:1.2 文章结构本文分为引言、正文和结论三个部分。

引言部分(Introduction)主要介绍了本文的背景和目的。

其中,概述部分介绍了本文要讲解的主题:gdb交叉编译调试。

通过引言部分,读者可以了解到本文所涉及的领域和问题,并对后续内容有一个整体的了解。

正文部分(Main Body)是本文的主要内容,分为多个小节。

第一个小节(2.1 GDB简介)介绍了GDB的基本概念和功能,包括它是什么、为什么要使用它以及如何使用它进行调试等。

通过这一小节,读者可以快速了解GDB的基本知识。

第二个小节(2.2 交叉编译概述)介绍了交叉编译的基本概念和原理。

解释了为什么需要进行交叉编译以及如何进行交叉编译。

此小节还可以涵盖一些常见的交叉编译工具和方法,以帮助读者更好地理解交叉编译的过程和技术。

gdb调试技巧

gdb调试技巧

gdb调试技巧GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。

它是一种强大的命令行调试工具。

一般来说,调试器的功能:能够运行程序,设置所有能影响程序运行的参数;能够让程序在指定条件下停止运行;能够在程序停止时检查所有参数的情况;能够根据指定条件改变程序的运行。

gdb调试源代码流程:1)进入GDB #gdb test只需输入GDB和要调试的可执行文件即可,在GDB的启动画面中指出了GDB的版本号、遵循的许可等信息,接下来就进入了由"(gdb)"开头的命令行界面了;2)查看文件(gdb) l在GDB中键入"l"(list)就可以查看程序的源码了,GDB列出的源代码中明确地给出了对应的行号,方便代码的定位;3)设置断点(gdb) b 6只需在"b"(break)后加入对应的行号即可,在GDB中利用行号设置断点是指代码运行到对应行之前暂停;设置断点可以使程序执行到某个位置时暂停,程序员在该位置处可以方便地查看变量的值、堆栈情况等;一般情况下,源代码中大家行号与用户书写程序的行号是一致的,但有时由于用户的某些编译选项会导致行号不一致的情况,因此,一定要查看在GDB中的行号;4)查看断点处情况(gdb) info b可以键入"info b"来查看断点处情况,可以设置多个断点;5)运行代码(gdb) rGDB默认从首行开始运行代码,键入"r"(run)即可;程序运行到断点处停止。

6)看变量值(gdb) p n在程序暂停之后,程序员可以查看断点处的相关变量值,在GDB 中只需键入"p 变量名"(print)即可;GDB在显示变量值时都会在对应值之前加上"$N"标记,它是当前变量值的引用标记,以后若想再次引用此变量,就可以直接写作"$N",而无需写冗长的变量名;7)观察变量(gdb) watch n在某一循环处,往往希望能够观察一个变量的变化情况,这时就可以键入命令"watch"来观察变量的变化情况,GDB在"n"设置了观察点;8)单步运行(gdb) n单步运行是指一次只运行一条语句,这样可以方便查看程序运行的结果,在此处只需键入"n"(next)即可;随着程序的单步运行,当变量n的值发生变化时,GDB就会自动显示出n的变化情况。

gdb进入函数

gdb进入函数

gdb进入函数GDB(GNUDebugger)是一种强大的调试工具,可以帮助程序员诊断和修复程序中的错误。

在调试过程中,经常需要进入函数查看函数内部的变量和执行过程。

本文将介绍如何使用GDB进入函数进行调试。

一、编译程序时加入调试信息在使用GDB进行调试之前,需要在编译程序时加入调试信息。

使用gcc编译程序时,需要加上-g选项,如下所示:```gcc -g -o program program.c```-g选项会在编译生成的可执行文件中加入调试信息。

如果不加-g选项,GDB将无法正确地解释可执行文件中的代码。

二、启动GDB在编译生成的可执行文件上启动GDB,如下所示:```gdb program```这将启动GDB,并将可执行文件加载到GDB中。

此时,GDB处于交互模式,可以输入各种命令来进行调试。

三、设置断点在进入函数之前,需要设置一个断点,以便在程序执行到该断点时停止。

可以使用break命令设置断点,如下所示:break function_name```其中,function_name是要设置断点的函数名。

如果要在特定行设置断点,可以使用以下命令:```break file_naline_number```其中,file_name是要设置断点的源文件名,line_number是要设置断点的行号。

设置断点后,可以使用info breakpoints命令查看当前设置的断点。

四、运行程序在设置断点后,可以使用run命令运行程序,如下所示:```run```程序将开始运行,直到遇到设置的断点时停止。

停止时,GDB将显示断点所在的代码行,并在命令行提示符下等待输入。

五、进入函数在程序停止在断点处时,可以使用step命令进入函数,如下所示:step```这将进入当前断点所在的函数,并停止在函数内部的第一行代码处。

此时,GDB将显示函数名和第一行代码,并在命令行提示符下等待输入。

六、查看变量进入函数后,可以使用print命令查看函数内部的变量值,如下所示:```print variable_name```其中,variable_name是要查看的变量名。

gdb使用教程

gdb使用教程

gdb使用教程GDB是GNU调试器的缩写,是一个功能强大的命令行调试工具,用于帮助开发人员在调试过程中定位和修复程序中的错误。

以下是GDB的使用教程:1. 编译程序时添加调试信息:在使用GDB进行调试之前,需要确保程序在编译时包含了调试信息。

可以通过在编译命令中添加`-g`选项来实现。

例如:`gcc -g main.c -o main`。

2. 启动GDB:在命令行中输入`gdb`命令,然后输入可执行文件的路径作为参数。

例如:`gdb ./main`。

3. 设置断点:断点是在程序执行到指定位置时停下来的标记。

可以使用`break`命令来设置断点。

例如:`break main`可以在`main`函数的开头设置一个断点。

4. 开始执行程序:使用`run`命令来运行程序。

例如:`run`。

5. 执行程序并停在断点处:当程序开始运行后,会在达到断点处停下来等待输入。

此时可以使用一些GDB命令来检查程序的状态,如查看变量的值、栈帧等。

6. 单步执行:使用`next`命令来逐行执行程序。

例如:`next`。

7. 跳出函数:使用`finish`命令可以跳出当前正在执行的函数,并停在调用该函数的上一个函数中。

8. 继续执行:使用`continue`命令可以接着执行程序直到下一个断点或程序结束。

9. 查看变量的值:使用`print`或简写的`p`命令可以查看变量的值。

例如:`print i`可以查看变量`i`的值。

10. 修改变量的值:使用`set`命令可以修改变量的值。

例如:`set i = 10`可以将变量`i`的值修改为10。

11. 查看函数调用栈:使用`backtrace`或简写的`bt`命令可以查看函数调用栈。

12. 退出GDB:使用`quit`命令可以退出GDB。

以上是一些常用的GDB命令,使用GDB进行调试时还有很多其他的功能和命令可以使用,可以通过阅读GDB的文档来更详细地了解。

gdb的安装及使用流程

gdb的安装及使用流程

gdb的安装及使用流程1. 简介gdb是GNU Debugger的缩写,是一款功能强大的调试工具,可用于调试C、C++等程序。

本文将介绍如何安装和使用gdb。

2. 安装gdb以下是在Ubuntu系统上安装gdb的步骤:1.打开终端。

2.输入以下命令安装gdb:sudo apt-get install gdb3.输入系统密码确认安装。

4.等待安装完成。

3. 使用gdb进行调试以下是使用gdb进行调试的基本流程:1.编写带有调试信息的程序。

2.编译程序时需要添加-g选项,以保留调试信息。

例如:gcc -g -o program program.c3.在终端中输入以下命令启动gdb:gdb program这里的program是编译后生成的可执行文件。

4.使用gdb的命令进行调试。

下面是一些常用的gdb命令:•run:运行程序。

•break:设置断点。

•continue:继续执行程序直到下一个断点。

•next:单步执行程序。

•print:打印变量的值。

•finish:执行完当前函数并返回到调用该函数的地方。

•quit:退出gdb。

5.根据需要重复步骤4进行调试,直到找到和解决问题。

4. 调试示例下面以一个简单的C程序进行演示:```c #include <stdio.h>int factorial(int n) { if (n == 1) return 1; else return n * factorial(n-1); } int main() { int n = 5; printf(。

gdb 使用方法

gdb 使用方法

gdb 使用方法一、基本用法1. 启动gdb可以通过在命令行中输入"gdb"命令来启动gdb,并指定要调试的可执行文件作为参数。

例如,要调试名为"program"的可执行文件,可以输入以下命令:```gdb program```2. 设置断点断点是一个程序中的特定位置,当程序执行到该位置时,会暂停执行,从而可以检查程序的状态。

可以使用"gdb"命令设置断点。

例如,要在程序的第10行设置一个断点,可以输入以下命令:```break 10```可以使用"break"命令指定函数名或文件名和行号来设置断点。

3. 运行程序在gdb中运行程序时,可以使用"run"命令。

如果程序需要命令行参数,可以在"run"命令后面添加这些参数。

例如,要运行程序并传递参数"arg1"和"arg2",可以输入以下命令:```run arg1 arg2```4. 执行程序在gdb中执行程序时,可以使用"continue"命令。

该命令会让程序继续执行,直到遇到下一个断点或程序结束。

5. 单步执行在gdb中,可以使用"next"命令逐行执行程序。

该命令会执行当前行,并将程序指针移到下一行。

如果当前行是函数调用,"next"命令会将程序指针移到函数的第一行。

6. 查看变量的值在gdb中,可以使用"print"命令查看变量的值。

例如,要查看变量"var"的值,可以输入以下命令:```print var```7. 修改变量的值在gdb中,可以使用"set"命令修改变量的值。

例如,要将变量"var"的值设置为10,可以输入以下命令:```set var = 10```8. 退出gdb在gdb中退出调试会话时,可以使用"quit"命令。

(2021年整理)GDB调试命令手册.

(2021年整理)GDB调试命令手册.

(完整版)GDB调试命令手册.编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整版)GDB调试命令手册.)的内容能够给您的工作和学习带来便利。

同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整版)GDB调试命令手册.的全部内容。

(完整版)GDB调试命令手册.编辑整理:张嬗雒老师尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布到文库,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是我们任然希望 (完整版)GDB调试命令手册。

这篇文档能够给您的工作和学习带来便利。

同时我们也真诚的希望收到您的建议和反馈到下面的留言区,这将是我们进步的源泉,前进的动力。

本文可编辑可修改,如果觉得对您有帮助请下载收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为〈(完整版)GDB调试命令手册。

> 这篇文档的全部内容。

常用的 gdb 命令backtrace 显示程序中的当前位置和表示如何到达当前位置的栈跟踪(同义词:where breakpoint 在程序中设置一个断点cd 改变当前工作目录clear 删除刚才停止处的断点commands 命中断点时,列出将要执行的命令continue 从断点开始继续执行delete 删除一个断点或监测点;也可与其他命令一起使用display 程序停止时显示变量和表达时down 下移栈帧,使得另一个函数成为当前函数frame 选择下一条 continue 命令的帧info 显示与该程序有关的各种信息jump 在源程序中的另一点开始运行kill 异常终止在 gdb 控制下运行的程序list 列出相应于正在执行的程序的原文件内容next 执行下一个源程序行,从而执行其整体中的一个函数print 显示变量或表达式的值pwd 显示当前工作目录pype 显示一个数据结构 (如一个结构或 C++类的内容quit 退出 gdbreverse-search 在源文件中反向搜索正规表达式run 执行该程序search 在源文件中搜索正规表达式set variable 给变量赋值signal 将一个信号发送到正在运行的进程step 执行下一个源程序行,必要时进入下一个函数undisplay display 命令的反命令,不要显示表达式until 结束当前循环up 上移栈帧,使另一函数成为当前函数watch 在程序中设置一个监测点(即数据断点whatis 显示变量或函数类型GDB 命令分类详解一:列文件清单。

gdb教程

gdb教程

gdb教程GDB是一个功能强大的调试器,它可以帮助开发人员定位和解决程序中的错误。

本教程将介绍如何使用GDB进行调试。

1. 安装GDB在开始使用GDB之前,首先需要在您的机器上安装它。

您可以通过在终端中运行以下命令来检查是否已安装GDB:```gdb --version```如果显示了GDB的版本信息,则表示已安装。

如果没有安装,可以通过系统包管理器或从GDB官方网站上下载安装包进行安装。

2. 编译程序在使用GDB之前,需要确保程序是以调试模式编译的。

在编译时,可以使用`-g`选项来启用调试信息的生成。

例如:```gcc -g -o myprogram myprogram.c```这样会生成一个名为`myprogram`的可执行文件,其中包含调试信息。

3. 启动GDB运行以下命令以启动GDB并加载程序:```gdb myprogram```这将启动GDB并将`myprogram`加载到调试器中。

4. 设置断点断点是GDB中的一个重要特性,它可以让您在程序执行时暂停并进行调试。

您可以使用`break`命令来设置断点。

例如,要在`main`函数的第10行设置一个断点,运行以下命令:```break main:10```当程序执行到该行时,它将暂停并等待您执行下一步操作。

5. 执行程序您可以使用`run`命令来执行程序。

例如:```run```程序将开始执行,并在遇到断点或程序结束时停止。

6. 调试命令一旦程序暂停,您可以使用各种GDB命令来查看和操作程序状态。

以下是一些常用的命令:- `next`: 执行下一行代码。

- `step`: 进入函数并执行下一行代码。

- `print <variable>`: 打印变量的值。

- `backtrace`: 打印函数调用堆栈。

- `continue`: 继续执行程序直到下一个断点或程序结束。

可以使用`help`命令来获取有关其他命令的更多信息。

7. 查看内存和寄存器GDB还可以让您查看程序的内存和寄存器状态。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

设置断点(break point)
`break ... if COND` 条件断点,当表达式COND非零时程序在断 点停止 例如`break 253 if i=10` `tbreak …` 设置一个只会停止一次的断点
设置观察点(watch point)
`watch EXPR` 为EXPR设置一个观察点,一旦EXPR被写入并发生变化,程 序停止 `rwatch EXPR` EXPR被读取时,程序停止 `awatch EXPR` EXPR被读取或者被写入时,程序停止 当程序运行到EXPR作用域以外的地方时,GDB将会自动删 除此观察点,如果想继续观察,必须重新设置观察点。
启动:
最通常的命令就是使用一个参数: $(m68k-linux-)gdb <可执行文档名> 你还可以同时为你的执行文件指定一个core文件: $gdb <可执行文件名> core 你也可以为你要执行的文件指定一个进程号:
$gdb <可执行文件名> <进程号>
常用启动参数:
-symbols <文件名>(-s <文件名>) 从<文件名>中读去符号 -x <文件名> 执行gdb命令,在<文件名>指定的文件中存放着一序列的gdb 命令,就象一个批处理 -directory(-d) <路径> 指定路径。把<路径>加入到搜索源文件的路径中
程序的恢复与单步调试

finish 运行程序,直到当前函数完成并返回,打印函数返回时的堆 栈地址和返回值及参数值等信息 until [location] 简写为u,继续运行程序直至跳出当前正在单步调试的循环体; 加参数表示继续运行到代码的location处或者当前stack frame返回


advance location 继续运行直至location处
GDB下运行程序
调试子进程的技巧:
正常情况下,可以在子进程运行后attach即可 如果需要调试子进程在启动过程中的问题,可以采取以下方法:

父进程启动代码: pid = fork(); if (0 == pid) exec(―sh‖ ―–c‖ ―child‖); 更改为 pid = fork(); if (0 == pid) exec(―sh‖ ―–c‖ ―gdb child‖);
查看程序堆栈
backtrace 可以简写为bt,打印当前的函数调用栈的所有信息 frame [n] 可以简写为f,切换到堆栈的第n层 up/down 在堆栈中向上/向下移动 info frame 打印更加详细的当前栈层的信息 info args 打印出当前函数的参数名及其值 info locals 打印出当前函数中所有局部变量及其值
GDB下运行程序
Run命令:
用于启动你的程序,使用命令前必须先指定你程序的名字(用 gdb的命令行参数)或使用‘file‘命令,来指定文件名
工作路径:
每次用‘run‘命令来运行程序时,程序将继承gdb的当前工作目 录。而gdb的工作目录是从它的父进程继承而来的(一般是shell)。 但你可以自己使用‘cd‘命令指定工作目录。 gdb的工作目录就是它去寻找某些文件或信息的途径。 `cd DIRECTORY' 把gdb的工作目录设为DIRECTORY `pwd' 打印输出当前目录
断点相关操作
为断点设置条件 condition bNum EXPR 为该断点设置条件 condition bNum 取消该断点的条件

忽略断点 ignore bnum count

忽略该断点count次
为断点设置命令列表
commands [bnum] ... command-list ... end 断点被触发后可以执行指定的命令列表

命令输入技巧:
可以把一个gdb命令缩写成开头几个字母,如果这没有二意性你可以直接回车来运行。 如果有不止一个选择的话,你还可以使用TAB键让gdb给你完成接下来的键入,或向你 显示可选择的命令

使用help
Hale Waihona Puke help [class] 显示某一类命令的列表
status Status inquiries.
处理信号


info signals/handle 打印各种已经定义处理方法的信号列表 handle signal keywords... 定义各种信号的处理方法 keywords: nostop 当被调试的程序收到信号时,GDB不会停止程序的运行, 但会打印信息通知用户收到这种信号 stop 当被调试的程序收到信号时,GDB会停止程序的运行 print/noprint 当被调试的程序收到信号时,GDB 会/不会 打印 出一条信息 pass GDB不会拦截信号,留给应用程序处理 nopass GDB拦截信号,不会让应用程序去处理
常用启动参数:
-quiet (-q) 安静模式,不输出介绍和版权信息 -x <文件名> 执行gdb命令,在<文件名>指定的文件中存放着一序列的gdb 命令,就象一个批处理 -directory(-d) <路径> 指定路径。把<路径>加入到搜索源文件的路径中
结束:
quit 直接退出gdb detach 放弃连接

子进程的main函数中使用sleep进行延时,睡眠期间attach之
断点



断点的作用是当你程序运行到断点时,无 论它在做什么都会被停止下来 可以在行上,函数上,甚至在确切的地址 上设置断点 观察点是一种特殊的断点。它们在程序中 某个表达式的值发生变化时起作用 可以设置当程序被中断时显示的程序变量
断点相关操作

查看断点
info breakpoints info watchpoints info break [n]

删除断点 禁止、使能断点
clear delete disable [breakpoints] 不带参数则禁止所有断点 enabe [breakpoints] 不带参数则使能所有断点 enable [breakpoints] once 使能,并在程序停止后禁止 enable [breakpoints] delete 使能,并在程序停止后删除
GDB下运行程序
程序编译:
当你在gdb下运行程序时,你必须先为gdb准备好 带有调试信息的可执行文档。 为了高效的调试一个程序,你需要使用编译器来产 生附带调试信息的可执行代码这些调试信息存储在 目标文件中;描述了变量数据类型和函数声明,在 源文件代码行和执行代码之间建立联系。 为产生调试信息,当你使用编译器时指定'-g'选项, 就可以为你的程序产生带有调试信息的可执行代码
Shell命令:
shell <command string> 启动一个shell执行<command string>, 不用退出GDB就可以执行一个shell命令 make [make-args] 使用[make-args]进行make 相当于`shell make make-args'
GDB命令
设置断点(break point)
使用‘break‘或简写成‘b‘来设置断点: `break function` 在某个函数上设置断点 `break + offset` `break – offset` 当前行的前(后)offset行上设置断点 `break filename:linenum` 在文件的某行设置断点 `break filename:function` 在文件的某函数设置断点 `break *address` 在地址address上设置断点,可以在无调试信息的程序中设置断点
GDB下运行程序
调试一个多线程的程序:
GDB会自动提示新线程创建 thread <threadno> 各线程间进行切换 info threads 查看已经存在的线程 无论gdb何时中断了你的程序(因为一个断点或是 一个信号),它自动选择信号或断点发生的线程 为当前线程。gdb将用一个格式为'[Switching to SYSTAG]'的消息来向你报告。
程序的恢复与单步调试




continue 简写为c,恢复程序运行,直到下一个断点或程序结束 step 简写为s,单步调试,如果有函数调用,会进入该函数。进入 函数的前提是,此函数被编译有调试信息 next 简写为n,单步调试,如果有函数调用,不会进入该函数 set step-mode `set step-mode on` 打开step-mode模式,在进行单步 调试时,不会因程序没有编译入调试信息而忽略“Step in‖ 。 这个参数有很利于查看程序运行时的汇编代码 `set step-mode off` 关闭step-mode模式
GDB下运行程序
调试多进程:
GDB对调试使用'fork'系统调用产生新进 程的程序没有很多支持。当一个程序开始 一个新进程时,GDB将继续对父进程进行 调试,子进程将不受影响的运行。如果你 在子进程可能会执行到的地方设了断点, 那么子进程将收到'SIGTRAP'信号,如果 子进程没 有对这个信号进行处理的话那么 缺省的处理就是使子进程终止。
查看运行时的数据
最常用的查看数据方法 print /FMT EXPR 按照格式FMT打印表达式EXPR的值
display /FMT EXPR 自动按照格式FMT打印表达式EXPR的值
例如: print /x i 以十六进制格式打印i的值
查看运行时的数据
表达式:
print和许多GDB的命令一样,可以接受一个表达 式,GDB会根据当前的程序运行的数据来计算这个 表达式,既然是表达式,那么就可以是当前程序运 行中的const常量、变量、函数等内容。但是GDB 不能使用调试程序中所定义的宏
相关文档
最新文档