要不考虑一下带 X 的调试器 ddd

$ sudo apt-get install ddd

简单用法可以参考网友博客

============================================

0) 为使用 GDB, 编译时需要加入调试信息 -g 选项,例如,

  $ gcc -g test.c -o test

1) 使用 GDB 开始调试

  $ gdb test

  也可以,

  $ gdb

  $ file test

2) list

  $ l(ist) : 列出当前执行的上下部分代码,默认一共显示 10 行

  $ l(ist) lineNum : 显示 lineNum 上下部分代码

  $ l(ist) lineNum1, lineNum2 : 显示从 lineNum1 到 lineNum2 之间的行

  $ l(ist) funcName : 显示名为 funcName 函数周围的代码

3) run

  $ r(un) : 开始执行,到第一个断点停止

  $ r(un) arg1 arg2 ... argn : 开始执行并以 arg1 arg2 ... argn 为参数

  $ show args : 查看最近一次传入的参数列表

  $ set args argNew1 argNew2 ... argNewn : 设置参数列表

  $ r(un) : 将以上一步的新参数列表运行

  $ c(ontinue) : 继续执行,到下一个断点停止

  $ n(ext) : 单步执行,不进入子函数

  $ s(tep): 单步执行,进入子函数

  $ finish : 退出子函数

4) 设置断点

  注意,断点尽量设置在执行语句上,不要在空行或注释上,因为这些信息编译时会去掉,如果设置在了这些行,断点会就近移动到下一行

  $ b(reak) lineNum : 在第 lineNum 行设置断点

  $ b(reak) funcName : 在函数 funcName 前设置断点,断点会出现在此函数的第一行

  $ b(reak) fileName:lineNum  : 在文件 fileName 的第 lineNum 行设置断点

  $ b(reak) fileName:funcName : 在文件 fileName 的函数 funcName 的第 1 行设置断点

  

  $ b(reak) lineNum if condition : 在 lineNum 行设置条件断点,当条件 condition 为真时激活该断点,例如,

  注意,断点要设在执行语句上,不能设置例如 for(xx;xx;xx) 上,

  $ b 8 if i == 5

  $ b 12 if (i + j) % 2 == 0

  $ condition breakNum : 取消条件断点的条件,其中 breakNum 可以用命令 $ info b(reak) 来查看

  $ info b(reak) : 显示当前所有断点信息

  $ d(elete) [breakpoints] breakNum : 删除第 breakNum 个断点,例如,删除第 3 个断点

  $ d 3

  $ d breakpoints 3

  $ disable breakNum  : 禁止第 breakNum 个断点,此时用 $ info b 可见这个断点的 Enb 域变为 n

  $ enable breakNum  : 启用第 breakNum 个断点,此时用 $ info b 可见这个断点的 Enb 域变为 y

  $ clear : 删除当前行的断点

  $ clear lineNum : 删除 lineNum 行的所有断点

  注意: 断点是 CPU 在某一地址取指令时中断

5) 设置监视点

  注意,只能在程序 run 起来之后,才能设置监视点。 所有断点的命令对监视点都适用。

  $ watch condition  :  在 condition 触发时停下来

  $ watch i > 5  : 如果出现 i 大于 5 则停下来

  注意: 监视点是 CPU 在某一地址读写数据时中断

6) 查看运行时数据

  $ p(rint) var  : 打印变量 var  的值

  $ p funcName::var  : 打印函数 funcName 中的 var 值

  

  $ p func(arg1, arg2, ...)  : 可对程序中出现的函数进行调用,arg1, arg2, ... 的值自定义即可, 例如 $ p sum(2, 3)

  $ p expression  : 可以打印一个自定义表达式的值,例如 $ p i+j*k

  $ p arrName : 查看数组 arrName 的值

  $ p *arrName@2 : 查看数组前两个元素的值

  

  $ p/t var : 以二进制格式显示变量 var,类似的还有 p/x, p/o, p/d, p/f, p/c 等

7) 设置自动显示变量

  $ display i

  $ display j

  之后每一次执行 gdb 命令,都会打印一次 i, j 的值

  $ info display  (查看已设置的自动显示变量信息)

  $ disable display 1 3 4  (禁用第 1, 3, 4, 项自动显示变量命令)

  $ disable display  (禁用所有自动显示变量命令)

  $ enable display  (启用所有自动显示变量命令)

8) 使用 GDB 环境变量

  $ set $i = 0  (设置变量 i)

  $ p arr[$i++]  (之后多次使用此条语句可打印连续的 arr 值)

9) 在程序运行中修改变量的值

  $ set var varName = x  : 修改变量 varName 的值为 x, 例如,

  $ set var width = 8

10) 在子函数调用中,可以使用 return 强制返回某个值并立即结束子函数的执行

  $ return val

11) 显示当前作用域的局部变量

  $ info locals

12) core dump 时 core 文件的生成和使用

  Ubuntu 默认不生成 core 文件,在 /proc/sys/kernel/core_* 一些文件有 core 的命令等设置规则可以修改。

  为了生成 core 文件,执行,

  $ ulimit -c unlimited  (意思是不限制 core 文件的大小)

  $ ulimit -c 0  (意思是限制 core 文件的大小为 0 (零), 即不生成 core 文件)    ->   这句是关闭 core 文件生成。

  之后再运行可执行文件,有 core dump 错误时,可以在当前目录下生成 core 文件

  在 GDB 中带着 core 文件启动调试,例如,

  $ gdb test -c core   (带着core 文件调试名为 test 的 ELF 可执行程序)

  然后可以执行其他任务了,例如,

  $ info locals (打印出错时的环境变量)

  举个例子,endless_process.c

int main(void)
{
while()
;
return ;
}

  > 编译。

  > Ubuntu 打开 core 选项:$ ulimit -c unlimited

  > 运行。

  > 按 Ctrl + \ 结束,在当前文件夹下生成 core 文件

  > 调试 $ gdb endless_process -c core  可得到如下信息

$ gdb endless_process -c core
GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from endless_process...done.
[New LWP 3328]
Core was generated by `./endless_process'.
Program terminated with signal SIGQUIT, Quit. ===>>> 表明结束是由于信号 SIGQUIT 引起的,而 SIGQUIT 信号正是按 Ctrl + \ 产生的。
#0 main () at endless_process.c:8
5 while(1)
(gdb)

13) 程序调用栈

  $ bt  : 或者 backtrace,打印程序调用栈,比如在子函数中,使用 bt 可以把每一层的函数调用打印出来,之后可以使用 frame num 转到任意frame,

  $ frame 1  : 转到第一个 frame

  $ info locals : 打印 frame 1 的局部变量

  $ frame 2 : 转到第二个 frame

  $ info locals  : 打印 frame 2 的局部变量

14) 其他帮助信息

  $ h(elp)

15) 退出调试

  $ q(uit)

16) 调试多进程程序,指定进程

  $ set follow-fork-mode [child | parent]

完。

GDB 命令回顾的更多相关文章

  1. IOS开发--常用的基本GDB命令

    gdb不是万能的,可是没有gdb却是万万不能的.这里给大家简单介绍下iOS开发中最基本的gdb命令. po po是print-object的简写,可用来打印所有NSObject对象.使用举例如下: ( ...

  2. jLink(v8)GDB 命令总结

    /** ****************************************************************************** * @author    Maox ...

  3. Linux学习笔记15——GDB 命令详细解释【转】

    GDB 命令详细解释 Linux中包含有一个很有用的调试工具--gdb(GNU Debuger),它可以用来调试C和C++程序,功能不亚于Windows下的许多图形界面的调试工具. 和所有常用的调试工 ...

  4. Xcode GDB 命令list

    此文下半部分为转载:但是这里有一些我自己使用技巧,结合下面的文章,我们会有更多的收获,在此感谢原创者.     --------------------- 关于调试异常崩溃: 一般崩溃是由内存使用错误 ...

  5. GDB命令行最基本操作

    程序启动: A.冷启动 gdb program              e.g., gdb ./cs gdb –p pid                 e.g., gdb –p `pidof c ...

  6. gdb命令调试技巧

    gdb命令调试技巧 一.信息显示1.显示gdb版本 (gdb) show version2.显示gdb版权 (gdb) show version or show warranty3.启动时不显示提示信 ...

  7. 如何写gdb命令脚本

    作为UNIX/Linux下使用广泛的调试器,gdb不仅提供了丰富的命令,还引入了对脚本的支持:一种是对已存在的脚本语言支持,比如python,用户可以直接书写python脚本,由gdb调用python ...

  8. [转]常用 GDB 命令中文速览

    目录 break -- 在指定的行或函数处设置断点,缩写为 b info breakpoints -- 打印未删除的所有断点,观察点和捕获点的列表,缩写为 i b disable -- 禁用断点,缩写 ...

  9. 用GDB命令PO(print-object)打印UIView的视图层级

    UIView有一个私有方法: recursiveDescription 这个方法可以显示出当前视图的详细层级,可以在代码中直接调用,也可以在GDB中调用,在GDB中调用时需要借助另一个GDB命令:pr ...

随机推荐

  1. IIS下配置跨域设置Access-Control-Allow-Origin

    设置Access-Control-Allow-Origin 打开IIS,找到“HTTP响应标头”点进去, 在右侧可以看到添加,然后添加如下标头即可 Access-Control-Allow-Heade ...

  2. smarty模板基础----缓存数据

    缓存数据,这个并不是暂存的缓存,而是写入了内存的缓存 通过一个例子来书写:缓存数据 一.书写php和html页面的基本功能 既然是用smarty模板,那么前端和后端要分开写了 (1)php页面 1 2 ...

  3. Java用户自定义函数

    用户除了可以使用JavaScript的内置函数之外,还可以自己定义函数.自定义函数有3种方法. 使用关键字 function 构造 语法: function funcName([param1][,pa ...

  4. 入手FUJIFILM X100S

    有个朋友买了,用了说很好,于是在秋叶原的yodobashi体验了好几个星期天之后,终于下定决心出手了,购入了黑色限量版,还能用优惠券减免了200美元,最后全套1200美元.黑色限量版还包括了转接环,那 ...

  5. canvas学习总结四:绘制虚线

    上一章节我们说到,线性路径的绘制,主要利用movoTo(),lineTo()等方法,当然 Canvas 2D API 也提供了虚线的绘制方法,CanvasRenderingContext2D.setL ...

  6. java中的泛型与反射

    在java开发中,大多数情况是多人开发,那么如何在没有API的情况下,快速的理解到别人开发的一些类的详细信息呢? 比如函数名,类名,返回参数等等 我们可以定义一个反射机制的类,通过此类来打印此你想要操 ...

  7. SQL Server如何定位自定义标量函数被那个SQL调用次数最多浅析

    前阵子遇到一个很是棘手的问题,监控系统DPA发现某个自定义标量函数被调用的次数非常高,高到一个离谱的程度.然后在Troubleshooting这个问题的时候,确实遇到了一些问题让我很是纠结,下文是解决 ...

  8. kali2016.2(debian)快速安装mysql5.7.17

    糊里糊涂的删除了kali原本的mysql5.6.27版本,原本的mysql与很多软件关联在一起,每次安装都失败,后来把相关的都卸载了(悲催的浪费了一天) 下载地址  debian mysql下载地址 ...

  9. [20190226]删除tab$记录的恢复6.txt

    [20190226]删除tab$记录的恢复6.txt --//春节前几天做了删除tan$记录的测试,链接:http://blog.itpub.net/267265/viewspace-2565245/ ...

  10. java中 this() 和super()的作用及用法

    原文地址:http://www.cnblogs.com/hasse/p/5023392.html 一.This Java关键字this只能用于方法体中.this只能在类中的非静态方法中使用,静态方法和 ...