gdb

gdb是一个 c/c++ debug 工具

没有一个教程和文档比 gdb 官方手册更加详细和准确

这个文件只是简单地介绍其中一小部分频繁使用的功能, 具体需要结合 gdb 的官方文档

(gdb非常强大, 其文档有400多页, 完全是一本参考书的规格)

( 同时gdb也做到了透明, 大多数时候你使用它只需掌握极少的几条指令(基础功能中的指令) )

 

基础功能

n : next

用于跳转到下一条语句, 同时会先执行当前语句, 可配合 number 跳转多行

s : step

进入函数调用

b : break

断点

c : continue

继续执行

p : print

打印变量信息, ptype 可以打印类型信息(用于类, 它会将类的所有成员都打印出来)

l :list

查看当前行附近的代码信息, 可以指定行号和函数, 可以用于跳转到指定文件

bt : backtrace

调用回溯, 查看当前调用栈

f : frame

与 bt 的信息配合, 使用 number 指定跳转到某条函数调用之前

info

这条指令用于观察gdb指令的当前信息

例如: info breakpoints, info frame, info watchpoints, info record...

u : until

跳出当前循环, 或者配合 number 指定执行到何处

finish

完成当前函数调用, 跳转到函数调用的最后一条语句

 

中级功能

watch

观察点, 可以用来观察一个变量或者表达式的变化

checkpoint

检查点用来保存当前进度, 可以在执行若干语句之后回到当前检查点

record

记录命令的使用信息, 实用之处在于: 使用其中的 full 模式, 可以实现 reverse 操作

比如 reverse-next, 这将会反向执行到上一个语句

forward-search/search

前向搜索/搜索

inferior

gdb支持debug多个进程

thread

gdb支持debug多线程程序

catch

捕获一个事件

singal

捕获一个信号

win : winheight

进入可视化模式, 简单来说就是代码界面拥有了窗口, 同时一系列信息也会显示在上面

(不过这个模式实际上会出现会显示错误, 比如会显示删除符号, 显示tab键之类的问题, 我不知道这算不算bug...)

(或许我使用方式不对? )

e : edit

你可以在 gdb 中直接更改源文件, 不过这好像有点鸡肋...

disassemble

反编译代码, 显示 machine code

diaplay

自动显示变量

set (convenience variable)

使用该指令可以保存变量, 之后你可以用在任何命令的表达式里面, 记得前面加美元($)前缀

它可以用于对内存赋值!!!

也可以用于对寄存器赋值!!!

convenience function (10.12)

gdb提供了一系列的函数以供使用, 例如:

前面依旧要加 '$' 符号

register (这个我超喜欢的) (10.13)

这个指令支持你查看寄存器的内容, 使用方法是

(这个或许应该放在 p 中, 不过我觉得这应该放在高级内容中)

我依稀记得之前我曾经因为无法在运行时看内存内容而苦恼

现在这个问题随着gdb的深入学习而解决了, 以后我分析汇编的时候, 可以更加深入了

并且支持使用 set 来改变内容!!

info os [args]

查看系统相关信息, 比如:

将会查看系统使用文件描述符的信息

trace (13)

按照 gdb 官方文档的描述, 这个指令是用来调试那些对于实时性有要求的程序

但是我也没能理解这个指令是如何使用的, 同时有这么一句话

这个指令的内容占了整个 13 章节, 应该相当重要. 所以这里仅仅记录一下, 或许以后会用到

=========

后续内容(从 13 章往后)是一些高级内容(以置于我不得不将这段主题的标题改成中级功能...)

比如大型程序, 远程调试 ...

暂不研究

 

other

源自http://www.waider.ie/music/lyrics/gdb.html

源自https://www.gnu.org/music/gdb-song.html

感觉, 嗯, 很有气势