GDB 调试 ---转 比较全的东东
转自 程序人生:http://www.programlife.net/gdb-manual.html
Linux 包含了一个叫gdb 的GNU 调试程序。gdb 是一个用来调试C和C++程序的强力调试器。它使你能在程序运行时观察程序的内部结构和内存的使用情况。以下是 gdb 所提供的一些功能:它使你能监视你程序中变量的值、它使你能设置断点以使程序在指定的代码行上停止执行、它使你能一行行的执行你的代码。在命令行上键入gdb并按回车键就可以运行gdb 了。(Windows需要安装MinGW或者CygWin并且需要配置环境变量才可以使用)
GDB 命令行参数
启动 GDB:
l gdb executable
l gdb -e executable -c core-file
l gdb executable -pid process-id
(使用命令 'ps -auxw' 可以查看进程的 pid)
|
选项 |
含义 |
|
–help |
列出命令行参数。 |
|
–exec=file |
指定可执行文件。 |
|
–core=core-file |
指明 core 文件。 |
|
–command=file |
从指定文件中读取 gdb 命令。 |
|
–directory=directory |
把指定目录加入到源文件搜索路径中。 |
|
–cd=directory |
以指定目录作为当前路径来运行 gdb 。 |
|
–nx |
不要执行 .gdbinit 文件中的命令。默认情况下,这个文件中的命令会在所有命令行参数处理完后被执行。 |
|
–batch |
在非交互模式下运行 gdb 。从文件中读取命令,所以需要 -x 选项。 |
|
–symbols=file |
从指定文件中读取符号表。 |
|
-write |
允许对可执行文件和 core 文件进行写操作。 |
|
–quiet |
不要打印介绍和版权信息。 |
|
–tty=device |
指定 device 为运行程序的标准输入输出。 |
|
–pid=process-id |
指定要附属的进程 ID 。 |
GDB命令
GDB 中使用的命令:
|
命令 |
描述 |
|
help |
列出 gdb 帮助信息。 |
|
help topic |
列出相关话题中的 gdb 命令。 |
|
help command |
列出命令描述信息。 |
|
apropos search-word |
搜索相关的话题。 |
|
info args |
列出运行程序的命令行参数。 |
|
info breakpoints |
列出断点。 |
|
info break |
列出断点号。 |
|
info break breakpoint-number |
列出指定断点的信息。 |
|
info watchpoints |
列出观察点。 |
|
info registers |
列出使用的寄存器。 |
|
info threads |
列出当前的线程。 |
|
info set |
列出可以设置的选项。 |
|
Break and Watch |
|
|
break funtion |
在指定的函数,或者行号处设置断点。 |
|
break +offset |
在当前停留的地方前面或后面的几行处设置断点。 |
|
break file:func |
在指定的file文件中的func处设置断点。 |
|
break file:nth |
在指定的file文件中的第nth行设置断点。 |
|
break *address |
在指定的地址处设置断点。一般在没有源代码时使用。 |
|
break line-number ifcondition |
如果条件满足,在指定位置设置断点。 |
|
break line threadthread-number |
在指定的线程中中断。使用info threads可以显示线程号。 |
|
tbreak |
设置临时的断点。中断一次后断点会被删除。 |
|
watch condition |
当条件满足时设置观察点。 |
|
clear |
清除函数func处的断点。 |
|
delete |
删除所有的断点或观察点。 |
|
delete breakpoint-number |
删除指定的断点,观察点。 |
|
disable breakpoint-number-or-range |
不删除断点,仅仅把它设置为无效,或有效。 |
|
enable oncebreakpoint-number |
设置指定断点有效,当到达断点时置为无效。 |
|
enable del breakpoint-number |
设置指定断点有效,当到达断点时删除它。 |
|
finish |
继续执行到函数结束。 |
|
Line Execution |
|
|
step |
进入下一行代码的执行,会进入函数内部。 |
|
next |
执行下一行代码。但不会进入函数内部。 |
|
until until line-number ifcondition |
继续运行直到到达指定行号,或者函数,地址等。 |
|
return |
弹出选中的栈帧(stack frame)。如果后面指定参数,则返回表达式的值。 |
|
stepi |
执行下一条汇编/CPU指令。 |
|
info signals |
当收到信号时执行下列动作:nostop(不要停止程序),stop(停止程序执行),print(显示信号),noprint(不显示),pass/noignore(允许程序处理信号),nopass/ignore(不让程序接受信号) |
|
where |
显示当前的行号和所处的函数。 |
|
Program Stack |
|
|
backtrace |
显示当前堆栈的追踪,当前所在的函数。 |
|
backtrace full |
打印所有局部变量的值。 |
|
frame number |
选择指定的栈帧。 |
|
up number |
向上或向下移动指定个数的栈帧。 |
|
info frame addr |
描述选中的栈帧。 |
|
info args |
显示选中栈帧的参数,局部变量,异常处理函数。all-reg也会列出浮点寄存器。 |
|
Source Code |
|
|
list |
列出相应的源代码。 |
|
set listsize count |
设置list命令打印源代码时的行数。 |
|
directory directory-name |
在源代码路径前添加指定的目录。 |
|
directory |
当后面没有参数时,清除源代码目录。 |
|
Examine Variables |
|
|
print variable |
打印指定变量的值。 |
|
p *array-var@length |
打印arrary-var中的前length项。 |
|
p/x var |
以十六进制打印整数变量var。 |
|
p/d var |
把变量var当作有符号整数打印。 |
|
p/u var |
把变量var作为无符号整数打印。 |
|
p/o var |
把变量var作为八进制数打印。 |
|
p/t var |
以整数二进制的形式打印var变量的值。 |
|
p/c variable |
当字符打印。 |
|
p/f variable |
以浮点数格式打印变量var。 |
|
p/a variable |
打印十六进制形式的地址。 |
|
x/w address |
打印指定的地址,以四字节一组的方式。 |
|
call expression |
类似于print,但不打印 void 。 |
|
disassem addr |
对指定地址中的指令进行反汇编。 |
|
Controlling GDB |
|
|
set gdb-option value |
设置 GDB 的选项。 |
|
set print array on |
以可读形式打印数组。默认是 off 。 |
|
set print array-indexes on |
打印数组元素的下标。默认是 off 。 |
|
set print pretty on |
格式化打印 C 结构体的输出。 |
|
set print union on |
打印 C 中的联合体。默认是 on 。 |
|
set print demangle on |
控制 C++ 中名字的打印。默认是 on 。 |
|
Working Files |
|
|
info files |
列出当前的文件,共享库。 |
|
file file |
把file当作调试的程序。如果没指定参数,丢弃。 |
|
core file |
把file当作 core 文件。如果没指定参数,则丢弃。 |
|
exec file |
把file当作执行程序。如果没指定参数,则丢弃。 |
|
symbol file |
从file中读取符号表。如果没指定参数,则丢弃。 |
|
load file |
动态链入file文件,并读取它的符号表。 |
|
path directory |
把目录directory加入到搜索可执行文件和符号文件的路径中。 |
|
Start and Stop |
|
|
run |
从头开始执行程序,也允许进行重定向。 |
|
continue |
继续执行直到下一个断点或观察点。 |
|
continue number |
继续执行,但会忽略当前的断点number次。当断点在循环中时非常有用。 |
|
kill |
停止程序执行。 |
|
quit |
退出 GDB 调试器。 |
GDB 操作提示
l 在编译可执行文件时需要给 gcc 加上 "-g" 选项,这样它才会为生成的可执行文件加入额外的调试信息。
l 不要使用编译器的优化选项,比如: "-O","-O2"。因为编译器会为了优化而改变程序流程,那样不利于调试。
l 在 GDB 中执行 shell 命令可以使用:shell command
l GDB 命令可以使用 TAB 键来补全。按两次 TAB 键可以看到所有可能的匹配。
l GDB 命令缩写:例如 info bre 中的 bre 相当于 breakpoints。
GDB 在 Emacs 中的操作:
|
emacs 按键 |
动作 |
|
M-x gdb |
切换到 gdb 模式。 |
|
C-h m |
显示 gdb 模式介绍信息。 |
|
M-s |
等同于gdb 中的 step 命令。 |
|
M-n |
等同于gdb 中的 next 命令。 |
|
M-i |
等同于gdb 中的 stepi 命令。 |
|
C-c C-f |
等同于gdb 中的 finish 命令。 |
|
M-c |
等同于gdb 中的 continue 命令。 |
|
M-u |
等同于gdb 中的 up 命令。 |
|
M-d |
等同于gdb 中的 down 命令。 |
本博客很少转载他人文章,如未特别标明,均为原创,转载请注明出处:
本文出自程序人生 >> GDB调试手册
GDB 调试 ---转 比较全的东东的更多相关文章
- 比较全面的gdb调试命令
from:http://blog.csdn.net/xiajun07061225/article/details/8960332 http://blog.csdn.net/cjfeii/article ...
- 比较全面的gdb调试命令 (转载)
转自http://blog.csdn.net/dadalan/article/details/3758025 用GDB调试程序 GDB是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形 ...
- Linux gdb调试入门
没有使用过gdb调试过程序的觉得gdb是个很神奇的东东,如果你使用它调试一次保证你想忘记它都难,下面看看它的庐山真面目吧! GDB概述 GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具. ...
- 记录一下收集到的clojure相关的东东
https://github.com/plexus/chestnut 一个用来调试clojurescript的工具,解决 Clojure, ClojureScript, and CSS的reload问 ...
- Linux下交叉编译gdb,gdbserver+gdb的使用以及通过gdb调试core文件
交叉编译gdb和gdbserver 1.下载gdb:下载地址为:http://ftp.gnu.org/gnu/gdb/按照一般的想法,最新版本越好,因此下载7.2这个版本.当然,凡事无绝对.我们以gd ...
- 使用gdb调试c++程序
上篇(使用c++开发跨平台程序)说到,我不怕造东西,我怕的是造出来的东西,如果出了问题,我却不知道原因.所以调试分析是一个重要的手段. C++调试是一个复杂的活.虽然大部分调试可以通过IDE在开发期间 ...
- Linux下GDB调试
GDB 是一个强大的命令行调试工具.大家知道命令行的强大就是在于,其可以形成执行 序列,形成脚本.UNIX 下的软件全是命令行的,这给程序开发提供了极大的便利,命令行 软件的优势在于, 他们可以非常容 ...
- core dump gdb调试
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIG ...
- C++@sublime GDB调试
正文转自:http://www.cppblog.com/lucency/archive/2012/08/09/59214.html 之前在网上搜索了好久使用sublime调试C和C++的文章,但是徒劳 ...
随机推荐
- 企业wiki之confluence安装部署(linux)及其破解
系统环境(虚拟机) centos6.5 2G运行内存,30g硬盘,cpu最好也分配两个或多个,因为我在安装过程中发现很卡,cpu占用率几乎占满 需要用到的安装包和文件可以在这里找 链接:https ...
- Cassandra基础
Apache Cassandra特性 Apache Cassandra由Facebook基于Amazon的Dynamo及其在Google的Bigtable上的数据模型设计开发的面相列的数据库,实现没有 ...
- 轻量级web框架cicada----(转)
源码地址: https://github.com/TogetherOS/cicada 快速启动 下面来看看如何快速启动一个 HTTP 服务. 只需要创建一个 Maven 项目,并引入核心包. < ...
- PHP socket 服务器框架集
1.Swoole:重新定义PHP PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时 ...
- Vivado中ILA的使用
Vivado中ILA的使用 1.编写RTL代码 其中需要说明的是(* keep = "TRUE" *)语句的意识是保持cnt信号不被综合掉,方便以后的调试,是否可以理解为 ...
- java小程序(课堂作业02)
1,三种方法计算组合数 ①设计思路:第一种方法就是通过阶乘公式然后运用公式计算出组合数,第二种通过公式推导出cnk=n/(n-k)cnk-1,然后然后从ckk 开始运算到cnk,第三种方法就是通过递归 ...
- 如何让classmethod只允许使用用类对象来调用
Django REST framework里面有这样一段代码,在网上查@classonlymethod的意思是使得classmethod只允许使用用类对象来调用 @classonlymethod de ...
- JAVA的debug入门和多断电调试
调试的一般都是逻辑 第一步的错误双击数字旁边的蓝色地方,或者点击右键如图 断点的意思就是程序执行在哪里就停止 当找不到DEBUG中的Variables是在位置输入Variables就可以了: 再按下F ...
- VS2010与Qt5.1.0集成(非源码方式)
早就听说qt可以集成到VS中,就是一直没尝试过.一直在使用qt creator,也没觉得它有什么不好.可最近VS用多了,我发现一个qt creator中很不好的毛病,就是代码自动完成时,creator ...
- js写法【3】
var m=[]; m[m.length]=xx;//相当于push 对Repeat方法提供了8种写法做比较,这一点还是不错的.