GDB进阶之路_new

合集下载

gdb调试汇编语言

gdb调试汇编语言

gdb调试汇编语言
GDB是一个功能强大的调试器,可以用来调试汇编语言程序。

在使用GDB调试汇编语言程序时,你需要首先确保程序已经被编译成可执行文件,并且包含了调试信息。

接下来,你可以通过以下步骤使用GDB来调试汇编语言程序:
1. 启动GDB,在命令行中输入`gdb`命令,然后在GDB提示符下输入可执行文件的名称。

2. 设置断点,你可以使用`break`命令在程序中设置断点,以便在特定的位置停止程序的执行。

例如,你可以输入`break main`来在程序的主函数处设置断点。

3. 运行程序,输入`run`命令来运行程序,程序会在设置的断点处停止执行。

4. 单步执行,使用`stepi`命令来逐条执行汇编指令,这样你可以逐步跟踪程序的执行过程。

5. 查看寄存器和内存,使用`info registers`命令可以查看寄
存器的值,而使用`x`命令可以查看内存中特定地址的内容。

6. 检查堆栈,使用`backtrace`命令可以查看当前的函数调用堆栈,而使用`frame`命令可以切换到不同的堆栈帧。

7. 观察变量,使用`print`命令可以查看特定变量的值,这对于检查程序状态非常有用。

8. 继续执行,当你想让程序继续执行时,可以使用`continue`命令来让程序一直执行到下一个断点或者程序结束。

以上是使用GDB调试汇编语言程序的基本步骤,当然,在实际调试过程中可能会有更复杂的情况需要处理,但是掌握了这些基本操作之后,你就可以更有效地使用GDB来调试汇编语言程序了。

希望这些信息对你有所帮助。

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是要查看的变量名。

程序员技术练级攻略——程序员大牛进阶之路!

程序员技术练级攻略——程序员大牛进阶之路!

程序员技术练级攻略——程序员大牛进阶之路!你是否觉得自己从学校毕业的时候只做过小玩具一样的程序?走入职场后哪怕没有什么经验也可以把以下这些课外练习走一遍(朋友的抱怨:学校课程总是从理论出发,作业项目都看不出有什么实际作用,不如从工作中的需求出发)建议:不要乱买书,不要乱追新技术新名词,基础的东西经过很长时间积累而且还会在未来至少10年通用。

回顾一下历史,看看历史上时间线上技术的发展,你才能明白明天会是什么样。

一定要动手,例子不管多么简单,建议至少自己手敲一遍看看是否理解了里头的细枝末节。

一定要学会思考,思考为什么要这样,而不是那样。

还要举一反三地思考。

注:你也许会很奇怪为什么下面的东西很偏Unix/Linux,这是因为我觉得Windows下的编程可能会在未来很没有前途,原因如下:现在的用户界面几乎被两个东西主宰了,1)Web,2)移动设备iOS或Android。

Windows的图形界面不吃香了。

越来越多的企业在用成本低性能高的Linux和各种开源技术来构架其系统,Windows的成本太高了。

微软的东西变得太快了,很不持久,他们完全是在玩弄程序员。

详情参见《Windows编程革命史》所以,我个人认为以后的趋势是前端是Web+移动,后端是Linux+开源。

开发这边基本上没Windows什么事。

1、学习一门脚本语言,例如Python/Ruby可以让你摆脱对底层语言的恐惧感,脚本语言可以让你很快开发出能用得上的小程序。

实践项目:处理文本文件,或者csv (关键词python csv, python open, python sys) 读一个本地文件,逐行处理(例如 word count,或者处理log)遍历本地文件系统 (sys, os, path),例如写一个程序统计一个目录下所有文件大小并按各种条件排序并保存结果跟数据库打交道(python sqlite),写一个小脚本统计数据库里条目数量学会用各种print之类简单粗暴的方式进行调试学会用Google (phrase, domain, use reader to follow tech blogs)为什么要学脚本语言,因为他们实在是太方便了,很多时候我们需要写点小工具或是脚本来帮我们解决问题,你就会发现正规的编程语言太难用了。

gdb调试案例

gdb调试案例

gdb调试案例以GDB调试案例为题,我将列举以下10个案例,每个案例将描述GDB的使用场景、调试目标、具体步骤和调试结果,以帮助读者更好地理解和掌握GDB调试工具。

案例一:查看程序崩溃的原因场景:当程序崩溃时,我们需要找出崩溃的原因,以便修复程序中的bug。

目标:在程序崩溃时,使用GDB查看崩溃的原因。

步骤:1. 使用-g选项编译程序,以包含调试信息。

2. 执行gdb命令,加载可执行文件。

3. 在GDB中运行程序,当程序崩溃时,GDB会自动停止程序的执行。

4. 使用backtrace命令查看调用栈,找出导致崩溃的函数和行号。

5. 使用print命令查看变量的值,以便进一步分析崩溃原因。

结果:通过查看调用栈和变量的值,我们可以定位到导致程序崩溃的具体代码行,并进行修复。

案例二:设置断点并跟踪程序执行场景:当程序运行过程中出现问题,我们需要跟踪程序的执行过程,以便找出问题所在。

目标:使用GDB设置断点并跟踪程序执行。

步骤:1. 使用-g选项编译程序,以包含调试信息。

2. 执行gdb命令,加载可执行文件。

3. 使用break命令设置断点,可以选择在特定函数或行号上设置断点。

4. 运行程序,GDB会在断点处停止程序的执行。

5. 使用step命令逐行执行程序,并查看变量的值。

6. 使用continue命令继续程序的执行,直到下一个断点或程序结束。

结果:通过设置断点和逐行执行程序,我们可以跟踪程序的执行过程,找出问题所在。

案例三:查看内存信息场景:当程序出现内存相关的问题时,我们需要查看程序的内存使用情况,以便分析问题所在。

目标:使用GDB查看程序的内存信息。

步骤:1. 使用-g选项编译程序,以包含调试信息。

2. 执行gdb命令,加载可执行文件。

3. 运行程序,GDB会自动停止程序的执行。

4. 使用info breakpoints命令查看已设置的断点。

5. 使用info registers命令查看寄存器的值。

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 next原理

gdb next原理

gdb next原理gdb next命令是GNU Debugger(简称gdb)中的一条指令,用于逐行执行代码并跳转到下一行。

它是一种调试工具,可以帮助开发人员在程序运行过程中进行调试和排错。

下面是一段以人类视角写作的文章,介绍gdb next命令的原理和功能。

在程序开发过程中,我们经常会遇到各种各样的bug。

有时候,我们需要逐行地查看代码的执行过程,并逐步排查问题所在。

这时,gdb的next命令就派上了用场。

使用gdb next命令,我们可以一行一行地执行代码。

当程序执行到next命令时,gdb会将控制权转移到下一行代码处。

这样,我们就可以逐步跟踪程序的执行过程,观察变量的变化以及函数的调用情况。

在使用gdb next命令时,我们还可以结合其他命令,比如print命令,来打印变量的值。

这样,我们就可以更加方便地观察程序的状态,并找出问题所在。

gdb next命令的原理其实很简单。

它通过改变程序的执行流程,将控制权逐行地传递给下一行代码。

当程序执行到函数调用语句时,next命令会将控制权传递给函数的第一行代码,而不会进入函数内部。

这样,我们可以跳过函数的执行过程,只观察函数的返回值。

除了next命令,gdb还提供了一系列其他的命令,比如step命令和continue命令。

step命令和next命令类似,但是它会进入函数内部,逐步执行函数内部的代码。

而continue命令则会一直执行代码,直到程序结束或者遇到断点。

总的来说,gdb next命令是一个非常有用的调试工具。

它可以帮助我们逐步跟踪程序的执行过程,找出问题所在,并进行修复。

通过合理使用gdb next命令,我们可以提高程序的质量和稳定性,提升开发效率。

希望以上内容能够对您理解gdb next命令有所帮助。

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 命令分类详解一:列文件清单。

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

优点
不依赖于具体执行 环境。
缺点
编译速度慢,可执 行文件占用空间大, 运行时耗内存。 依赖于具体执行环 境是否有程序使用 的第三方库。
动态链接库(*.so)
编译速度快,编译 后的执行文件占用 空间小,省内存。
基础篇:GDB之必备
GDB 常用命令 命令
list (l) run (r) continue (c) next (n) step (s) print (p) quit (q) watch (w) break (b) 执行当前被调试的程序 从断点挂起处继续执行 执行一行源代码但不进入函数内部 执行一行源代码而且进入函数内部 打印变量值 终止 gdb 使你能监视一个变量的值而不管它何时被改变 在代码里设置断点, 这将使程序执行到这里时被挂起。
进阶篇:简单又不简单的命令
1、continue/step/next 分别简称c/s/n,很常用的命令,另外,还有一个 start命令,很方便的命令,其相 当于在程序首行设定一个断点 首行设定一个断点然后运行run。 首行设定一个断点 2、break 简称b,此外,我们一般都先入为地把break N当成break的基本格式,其实break 是可以跟条件表达式 条件表达式,比如 break cm_xxx.C:158 if x > 0xffff0000,这个功能有的 条件表达式 时候比watch好用多了。 3、print 调试程序过程中,可以用print来修改变量值 修改变量值,格式如下: 修改变量值 (gdb) print x=4 4、print 用print打印 打印STL容器 容器的方法: 打印 容器 void dump(std::map<int, int>& x) { for(std::map<int, int>::const_iterator i = x.begin()), j(x.end()); i != j; i++) printf(“x[%d] = %d”, i->first, i->second);}
进阶篇:变量查看的技巧
3、 打印unicode字符串信息,例如: (gdb) start Breakpoint 1 at 0x40055c: file a.C, line 6. Starting program: /home/zyy/a.out main () at a.C:6 6 char * szAnsi = "Innovating Together Across Borders"; (gdb) n 7 wchar_t * szUnicode =L"软通动力 创新无边界"; (gdb) 8 } (gdb) p szAnsi $1 = 0x400670 "Innovating Together Across Borders" (gdb) p szUnicode $2 = (wchar_t *) 0x400698 直接调用print命令无法打印汉字,只会列出首地址,所以我们要想个办法, 类似于前面的call功能,不过是利用gdb本身提供的接口和语法。
进阶篇:变量查看的技巧
A. 修改.gdbinit文件,该文件是gdb启动时读的一个配置项,提供了接口定 义,我们可以定义一个wprint接口,负责打印双字节。 define wprint set $fd = open("/tmp/wprint", 577) set $x = write($fd, $arg0, wcslen($arg0) * sizeof(wchar_t)) set $y = close($fd) shell wprint end B. 提供wprint命令的实现,并生成wprint可执行文件,如下: setlocale(LC_ALL, ""); const char* file_name = "/tmp/wprint"; FILE* f = fopen(file_name, "rb"); if(f == 0) {printf("Open '%s' error! ", file_name); return -1;} fseek(f, 0, SEEK_END); long file_size = ftell(f) + 1; fseek(f, 0, SEEK_SET); wchar_t* buf = (wchar_t*)malloc(file_size + sizeof(wchar_t)); int r = fread(buf, 1, file_size, f); buf[file_size / sizeof(wchar_t)] = 0; printf("%S ", buf); free(buf);
进阶篇:变量查看的技巧
C. 将wprint文件拷到/tmp和/usr/bin中,此时便相当于添加了一个wprint命 令。 (gdb) start Breakpoint 1 at 0x40055c: file a.C, line 6. Starting program: /home/zyy/a.out main () at a.C:6 6 char * szAnsi = "Innovating Together Across Borders"; (gdb) n 7 wchar_t * szUnicode =L"软通动力 创新无边界"; (gdb) 8 } (gdb) p szAnsi $1 = 0x400670 "Innovating Together Across Borders" (gdb) p szUnicode $2 = (wchar_t *) 0x400698 (gdb) wprint szUnicode 软通动力 创新无边界 (gdb)
进阶篇:变量查看的技巧
4、 查看内存 使用examine命令(简写是x)来查看内存地址中的值,语法如下(n、f、u 时可选参数): x/ n:表示显示内存的长度。 f:表示显示的格式。 u:表示从当前地址往后请求的字节数。 n/f/u三个参数可以一起使用。例如: 命令:x/3uh 0x54320 表示,从内存地址0x54320读取内容,h表示以双字节 为一个单位,3表示三个单位,u表示按十六进制显示。 其实用的最多的也最简单的,就是直接后面带上数字,每次显示一个4字节 的信息,从低字节开始数,例如: main () at a.C:6 6 char * tmp = "1234567890"; (gdb) p tmp $1 = 0x400670 "1234567890" (gdb) x /4 0x400670 0x400670: 0x34333231 0x38373635 0x00003039 0x00000000 (gdb)
GDB进阶之路
Consumer公共部件开发部 潘剑
目录
基础篇 进阶篇 高级篇
基础篇:GDB之必备
可执行程序生成过程
基础篇:GDB之必备
UNIX下用到的一些库
类型
静态链接库(*.a)
使用方式
在程序链接时,把 第三方的库文件链 接进可执行文件。 程序链接时,只把 依赖的动态链接库 的库名放入可执行 文件中。
查看整个程序断点信息,如断点的个数及其位置; (gdb)info break 查看整个程序断点信息,如断点的个数及其位置; Num Type Disp Enb Address What 1 breakpoint keep y 0x080483c4 in main at overflow.c:15 breakpoint already hit 1 time (gdb)info all 显示整个程序运行到此时,各个寄存器中的值; 显示整个程序运行到此时,各个寄存器中的值;
进阶篇:变量查看的技巧
1、 在GDB中,你可以随时查看以下三种变量的值: 全局变量(所有文件可见的) 静态全局变量(当前文件可见的) 局部变量(当前Scope可见的) 另外,变量冲突的情况下可以用域操作符“::”,可以文件指定或类、函数指 定,例如: file::variable function::variable 2、 固定长度打印数组信息 (gdb) p *array@3 $1 = {0, 1, 2} (gdb) p *array@10 $2 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} (gdb)
基础篇:GDB调试举例
(gdb)b 15 “b+数字”是在某一行设置一个断点,可以同时设置多个断点; 数字” 数字 是在某一行设置一个断点,可以同时设置多个断点; Breakpoint 1 at 0x80483c4: file overflow.c, line 15. (gdb)r 5 hello 运行程序,在设置的断点处停止。注意程序的运行规则,如加参数等; 运行程序,在设置的断点处停止。注意程序的运行规则,如加参数等; Starting program: /root/test/day7/a.out 5 hello Breakpoint 1, main (argc=3, argv=0xbfffdea4) at overflow.c:15 停止在断点处; 停止在断点处; 15 i=atoi(argv[1]); (gdb)p i $1 = -1073747112 (gdb)n 16 s=i; (gdb)p i $2 = 5 查看一下此时变量i的值; 查看一下此时变量 的值; 的值 由于i此时还未有值 出现一个随机的值; 此时还未有值, 由于 此时还未有值,出现一个随机的值; 单步执行程序后半部分; 单步执行程序后半部分; 显示执行的是哪一行; 显示执行的是哪一行; 查看执行上一步语句之后变量i的值; 查看执行上一步语句之后变量 的值; 的值
描述
列出产生执行文件的源代码的一部分
基础篇:GDB调试举例
#gcc -g a.c -o a.out #gdb a.out 编译时-g 打开调试选项; 编译时 打开调试选项; 注意gdb后面跟的是可执行程序; 后面跟的是可执行程序; 注意 后面跟的是可执行程序 GNU gdb 6.6 Copyright (C) 2006 Free Software Foundation, Inc. GDB is free software, covered by the GNU General Public License, and you are welcome to change it and/or distribute copies of it under certain conditions. Type "show copying" to see the conditions. There is absolutely no warranty for GDB. Type "show warranty" for details. This GDB was configured as "x86_64-suse-linux". (gdb)l l是list的缩写,是查看源程序内容的命令; 的缩写, 是 的缩写 是查看源程序内容的命令; 1 #include<stdio.h> 2 #include<string.h> 3 int main(int argc,char* argv[]) 4 { 5 unsigned short s; (gdb)<enter> 直接回车时重复执行上次的命令; 直接回车时重复执行上次的命令;
相关文档
最新文档