让错误无处遁形gdb排错工具基本用法
作者:待续爱情2502861755 | 来源:互联网 | 2017-06-26 11:03
文章标题:让错误无处遁形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调试.
推荐阅读
本文探讨了一个项目中遇到的挑战,即如何通过技术手段解决不同菜单项触发时,跨域IFrame页面的高度自适应问题。通过创建中介页面和利用JavaScript与Cookie机制,实现无缝的用户体验。 ...
[详细]
蜡笔小新 2024-12-04 20:32:23
在 PHP 4, PHP 5 和 PHP 7 中,fstat 函数用于获取已打开文件指针的文件统计信息。此函数与 stat() 类似,但其操作对象为已打开的文件指针而非文件名称。 ...
[详细]
蜡笔小新 2024-12-04 20:02:58
探讨了在Android开发过程中遇到的关于TextView组件的常见问题,特别是如何实现多行文字的跑马灯效果,并提供了初步的解决方案和参考资料。 ...
[详细]
蜡笔小新 2024-12-04 18:32:09
Only2 Labs 是一家专注于视觉设计的工作室,如果您对当前的设计感到不满,或者急需寻找一个可靠的设计合作伙伴,甚至是您的团队项目需要专业指导,Only2 Labs 都将竭诚为您提供帮助。 ...
[详细]
蜡笔小新 2024-12-04 18:17:44
本文探讨了在使用phpMyAdmin过程中遇到的mysqli_init()函数错误,并提供了有效的解决方案。 ...
[详细]
蜡笔小新 2024-12-04 17:35:56
本文探讨了Windows Presentation Foundation (WPF)如何通过扩展Microsoft Build Engine (MSBuild)来增强其构建能力,特别是在处理WPF特有的任务时。 ...
[详细]
蜡笔小新 2024-12-04 17:26:08
本文探讨了在执行SQL查询时遇到的因字符集不同而导致查询结果差异的问题,特别是涉及中文字符时。文章分析了在不同字符集设置下,SQL查询结果的变化,并提供了详细的解决方案。 ...
[详细]
蜡笔小新 2024-12-04 16:39:13
本文探讨了如何在JavaScript中调用PHP函数及实现两者之间的有效交互,包括通过AJAX请求、动态生成JavaScript代码等方法。 ...
[详细]
蜡笔小新 2024-12-04 16:01:36
本文详细介绍了PHP Xdebug的安装步骤及其在PHP开发中的重要作用。Xdebug作为一款强大的调试工具,不仅能够帮助开发者追踪代码执行过程,还能有效提升代码质量和系统性能。 ...
[详细]
蜡笔小新 2024-12-04 15:55:44
本文对唐代诗人王建的《泛水曲》进行详细的赏析和翻译,探讨其文学价值及艺术特色。 ...
[详细]
蜡笔小新 2024-12-04 15:28:25
探讨《深入理解计算机系统》一书中关于寄存器保存规则的理解难题,特别是调用者保存寄存器的使用与恢复机制。 ...
[详细]
蜡笔小新 2024-12-04 15:26:12
本文深入探讨了Node.js中如何使用child_process模块来创建和管理子进程,包括exec、spawn和fork三种方法的具体应用及其实现细节。 ...
[详细]
蜡笔小新 2024-12-04 15:24:12
CGroups(Control Groups)是Linux内核提供的一个功能,旨在限制、记录和隔离进程组使用的物理资源,如CPU、内存和I/O等。它通过精细的资源管理,支持现代容器技术如Docker的资源限制需求。 ...
[详细]
蜡笔小新 2024-12-04 15:19:11
灰度共生矩阵是一种用于纹理分析的方法,它通过统计图像中像素对的空间关系来描述纹理特性。该方法能够捕捉到不同纹理模式下灰度级结构的重复出现情况,对于精细和粗糙纹理具有不同的表现。 ...
[详细]
蜡笔小新 2024-12-04 15:17:29
在炎热的午后,考试结束的那一刻,我回想起了两年前高考时的情景。虽然题目简单,但当时的心情却异常紧张。考试结束后,我带着高等数学的课本前往综合楼三楼自习。随着时间推移,教室里只剩下我和三位女生。不久后,她们离开前的一个小小举动,让我感受到了人性的美好。 ...
[详细]
蜡笔小新 2024-12-04 15:01:54
待续爱情2502861755
这个家伙很懒,什么也没留下!