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)
使用该指令可以保存变量, 之后你可以用在任何命令的表达式里面, 记得前面加美元($)前缀
(gdb) set {int}0x604010 = 4
(gdb) p v[0]
$16 = (__gnu_cxx::__alloc_traits<std::allocator<int> >::value_type &) @0x604010: 4
(gdb) set {int}0x604010 = 5
(gdb) p v[0]
$17 = (__gnu_cxx::__alloc_traits<std::allocator<int> >::value_type &) @0x604010: 5
它可以用于对内存赋值!!!
(gdb) p $rbx
$18 = 1
(gdb) set $rbx = 200
(gdb) p $rbx
$19 = 200
也可以用于对寄存器赋值!!!
convenience function (10.12)
gdb提供了一系列的函数以供使用, 例如:
$_strlen(str) $_streq(str1, str2) $_regex(str, regex)
前面依旧要加 ‘$’ 符号
register (这个我超喜欢的) (10.13)
这个指令支持你查看寄存器的内容, 使用方法是
p $register
(这个或许应该放在 p 中, 不过我觉得这应该放在高级内容中)
我依稀记得之前我曾经因为无法在运行时看内存内容而苦恼
现在这个问题随着gdb的深入学习而解决了, 以后我分析汇编的时候, 可以更加深入了
并且支持使用 set 来改变内容!!
info os [args]
查看系统相关信息, 比如:
info os files
将会查看系统使用文件描述符的信息
trace (13)
按照 gdb 官方文档的描述, 这个指令是用来调试那些对于实时性有要求的程序
但是我也没能理解这个指令是如何使用的, 同时有这么一句话
The tracepoint facility is currently available only for remote targets
追溯点当前只对远程目标有效
这个指令的内容占了整个 13 章节, 应该相当重要. 所以这里仅仅记录一下, 或许以后会用到
14 Debugging Programs That Use Overlays
=========
后续内容(从 13 章往后)是一些高级内容(以置于我不得不将这段主题的标题改成中级功能…)
比如大型程序, 远程调试 …
暂不研究
other
源自http://www.waider.ie/music/lyrics/gdb.html
1 | GDB! |
源自https://www.gnu.org/music/gdb-song.html
1 | Let's start at the very beginning, a very good place to start, |
感觉, 嗯, 很有气势