热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

让错误无处遁形gdb排错工具基本用法

文章标题:让错误无处遁形gdb排错工具基本用法。Linux是中国IT实验室的一个技术频道。包含桌面应用,Linux系统管理,内核研究,嵌入式系统和开源等一些基本分类

  当程序出错并产生core 时快速定位出错函数的办法,gdb 程序名 core文件名(一般是core,也可能是core.xxxx)
  
  调试程序使用的键
  r run 运行.程序还没有运行前使用
  c cuntinue 继续运行。运行中断后继续运行
  q 退出
  kill 终止调试的程序
  h help 帮助
   命令补全功能
  
  step 跟入函数
  next 不跟入函数
  b breakpoint 设置断点。
  
  用法:
  b 函数名 对此函数进行中断
  b 文件名:行号 对此文件中指定行中断.如果是当前文件,那么文件名与:号可以省略
  看当前断点数使用info break.禁止断点disable 断点号.删除delete 断点号.
  
  l list 列出代码行。一次列10 行。连接使用list将会滚动显示. 也可以在list 后面跟上 文件名:行号watch 观察一个变量的值。每次中断时都会显示这个变量的值p print 打印一个变量的值。与watch不同的是print只显示一次这里在顺便说说如何改变一个 value. 当你下指令 p 的时候,例如你用 p b,这时候你会看到 b 的 value, 也就是上面的 $1 = 15.你也同样可以用 p 来改变一个 value, 例如下指令 p b = 100 试试看,这时候你会发现, b 的 value 就变成 100 了:$1 = 100.
  
  网上抄录
  基本的使用方法简介
  
  前言
  程序代码中的错误可分为数类,除了最容易除错的语法错误,编译程序会告诉你错误所在外,大部分的错误都可以归类为执行时错误。GDB 的功能便是寻找执行时错误。如果没有除错程序,我们只能在程序中加入输出变量值的指令来了解程序执行的状态。有了 GDB 除错程序,我们可以设定在任何地方停止程序的执行,然后可以随意检视变量值及更动变量,并逐行执行程序。一个除错程序执行的流程通常是这样的:
  
  1. 进入除错程序并指定可执行文件。
  2. 指定程序代码所在目录。
  3. 设定断点后执行程序。
  4. 程序于断点中断后,可以 (1)检视程序执行状态;检视变量值或变更变量值 (2) 逐步执行程序,或是全速执行程序到下一个断点或是到程序结束为止。
  5. 离开除错程序。
  以下将分为下列数项分别介绍:
  1. 进入 GDB 及指定可执行档
  2. 指定程序代码所在目录及检视程序代码
  3. 断点的设定与清除
  4. 全速及逐步执行程序
  5. 检视及更改变量值
  6. 检视程序执行状态
  7. 读取 Core 文件信息
  进入 GDB 及指定可执行档:
  1. 进入 GDB 并读入可执行档 (档名为 'PROGRAM'),准备进行除错。
  gdb PROGRAM
  指定程序代码所在目录及检视程序代码
  1. 增加目录 DIR 到收寻程序代码的目录列表 (如果你的程序代码和可执行档放在同一个目录下,就不须指定程序代码所在目录。):
  (gdb) directory DIR
  
  2. 检视程序代码,格式计有:
  (gdb) list => 显示目前执行程序代码前后各五行的程序代码;或是显示从上次 list 之后的程序代码
  (gdb) list function => 显示该程序开始处前后五行的程序代码。
  (gdb) list - =>上次显示程序代码的前面的十行。
  
  断点的设定与清除
  1. 设定断点(指令为 break,可简写为 (b),格式计有:
  (gdb) break filename.c:30 => 在 filename.c 的第三十行处停止执行。
  (gdb) break function => 在进入 function 时中断程序的执行。
  (gdb) break filename.c:function => 在程序代码档 filename.c 中的函数 function 处设定断点。
  (gdb) break => 在下一个将被执行的命令设定断点。
  (gdb) break ... if cOnd=> 只有当 cond 成立的时候才中断。cond 须以 C 语言的语法写成。
  
  2. 显示各个断点的信息。
  (gdb) info break
  
  3. 清除断点(命令为 clear),格式同 break 。例如 :
  (gdb) clear filename.c:30
  
  4. 清除断点,NUM 是在 info break 显示出来的断点编号。
  (gdb) delete NUM
  全速及逐步执行程序
  1. 从程序开头全速执行程序,直到遇到断点或是程序执行完毕为止。
  (gdb) run
  
  2. 在程序被中断后,全速执行程序到下一个断点或是程序结束为止 (continue 指令可简写为 c)。
  (gdb) continue
  
  3. 执行一行程序. 若呼叫函数, 则将该包含该函数程序代码视为一行程序 (next 指令可简写为 n)。
  (gdb) next
  
  4. 执行一行程序. 若呼叫函数, 则进入函数逐行执行 (step 指令可简写为 s)。
  (gdb) step
  
  5. 执行一行程序,若此时程序是在 for/while/do loop 循环的最后一行,则一直执行到循环结束后的第一行程序后停止 (until 指令可简写为 u)。
  (gdb) until
  
  6. 执行现行程序到回到上一层程序为止。
  (gdb) finish
  检视及更改变量值
  1. print 叙述,显示该叙述执行的结果 (print 指令可简写为 p)。如
  (gdb) print a => 显示 a 变量的内容.
  (gdb) print sizeof(a) => 显示 a 变量的长度.
  
  2. display 叙述,在每个断点或是每执行一步时显示该叙述值。如
  (gdb) display a
  
  3. 更改变量值:
  (gdb) print (a=10) => 将变量 a 的值设定为 10.
  
  检视程序执行状态
  1. 查看程序执行到此时,是经过哪些函数呼叫的程序 (backtrace 指令可简写为 bt),也就是查看函数呼叫堆栈。
  (gdb) backtrace
  读取 Core 文件信息
  1. 读入 PROGRAM 及 PROGRAM.CORE 档,可检视 Core Dump 时程序变量值及程序流程状态 。
  gdb PROGRAM core
  说明:'core' 档案是由 PROGRAM 档执行后,遇到 Core Dump 时产生的 Core ?n?n名。如果你还需要该 Core 档,我们建议你将该档案档名更改为 PROGRAM.core。在输入上述命令后,你可以用 GDB 提供的检视变量值以及检视程序执行状态来读取程序 Core Dump 时的状态。
  
  补充一点儿
  (最近我刚在用gdb,感觉还不错,不过有的时候还是眼睛加printf更好
  使)
  我更多是用gdb直接调试程序,而不是core
  
  gdb 可执行文件名 (进入gdb环境)
  
  set ags -? (设置参数,即向你要调试的程序传参)
  
  另外,用break functionName 和break lineNum都可以设置断点用info break 可以查看当前断点的信息用clear清除断点的时候要和break相对应如果是用functionName设置的断点就只能 clear functionName用lineNum设置的断点就只能用clear lineNum
  
  BTW:可以到www.sunfreeware.com去下载gdb
  
  以上是我近几天学习gdb的一点经验,都是我犯过错误的地方希望对与我等同类的gdb菜鸟们有所帮助。
  
  如果是刚开始时也可以使用ddd图形化的
  
  另外对于断点可以使用delete 断点号删除断点号可以使用info break 得到
  
  我也说说我的体会:
  r (程序运行的参数) 可以设置运行时的参数shell 运行shell环境的东西,比如shell make,完了以后直接r重新启动程序,就可以带上次已经加过的参数运行,不用再敲参数了
  b 文件名:行号 有的时候很有用,嘿嘿
  info b 看断点信息
  disable 断点号 暂停某个断点
  enable 断点号 启动某个断点
  delete (断点号) 删除某个断点,不带断点号,全部删除
  x/32uxb 指针 以16进制显示该指针指向的32个字节的数据
  
  不过我还是不会用core调试.
  
推荐阅读
  • PHP玩家基地系统毕业设计(附源码、运行环境)的用户登录界面、游戏管理和玩家作品管理
    本文介绍了一个PHP玩家基地系统的毕业设计,包括用户登录界面、游戏管理和玩家作品管理等功能。附带源码和运行环境,并提供免费赠送本源代码和数据库的方式,请私信获取详细信息。摘要共计约XXX字。 ... [详细]
  • Monkey《大话移动——Android与iOS应用测试指南》的预购信息发布啦!
    Monkey《大话移动——Android与iOS应用测试指南》的预购信息已经发布,可以在京东和当当网进行预购。感谢几位大牛给出的书评,并呼吁大家的支持。明天京东的链接也将发布。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 关羽败走麦城时路过马超封地 马超为何没有出手救人
    对当年关羽败走麦城,恰好路过马超的封地,为啥马超不救他?很感兴趣的小伙伴们,趣历史小编带来详细的文章供大家参考。说到英雄好汉,便要提到一本名著了,没错,那就是《三国演义》。书中虽 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • PHP设置MySQL字符集的方法及使用mysqli_set_charset函数
    本文介绍了PHP设置MySQL字符集的方法,详细介绍了使用mysqli_set_charset函数来规定与数据库服务器进行数据传送时要使用的字符集。通过示例代码演示了如何设置默认客户端字符集。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 橱窗设计的表现手法及其应用
    本文介绍了橱窗设计的表现手法,包括直接展示、寓意与联想、夸张与幽默等。通过对商品的折、拉、叠、挂、堆等陈列技巧,橱窗设计能够充分展现商品的形态、质地、色彩、样式等特性。同时,寓意与联想可以通过象形形式或抽象几何道具来唤起消费者的联想与共鸣,创造出强烈的时代气息和视觉空间。合理的夸张和贴切的幽默能够明显夸大商品的美的因素,给人以新颖奇特的心理感受,引起人们的笑声和思考。通过这些表现手法,橱窗设计能够有效地传达商品的个性内涵,吸引消费者的注意力。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • faceu激萌变老特效的使用方法详解
    本文介绍了faceu激萌变老特效的使用方法,包括打开faceu激萌app、点击贴纸、选择热门贴纸中的变老特效,然后对准人脸进行拍摄,即可给照片添加变老特效。操作简单,适合新用户使用。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
author-avatar
待续爱情2502861755
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有