casyup.me@outlook.com

0%

other/gdb

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, 这将会反向执行到上一个语句

前向搜索/搜索

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
GDB!
based on _Tragedy_ by Barry, Robin and Maurice Gibb

Here's vi
In a lost and lonely part of code
Held in time
In a world of bugs my head explodes
Goin' home
I just can't make it all alone
I really should be coding you, coding you
running you, running you

CHORUS:
GDB when the program's wrong and the debug's on
It's GDB when the system dies and you don't know why
It's hard to bear
With no one to help you
You're going nowhere
GDB when you press control and the box just rolls
It's GDB when the system dies and you don't know why
It's hard to bear
With no one beside you
You're going nowhere

Night and Day
There's a burning down inside of me
Burning code
And a kernel that won't let me be
Down it goes
and I just can't take it all alone
I really should be coding you, coding you
Running you, running you

REPEAT CHORUS

REPEAT CHORUS(fade)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Let's start at the very beginning, a very good place to start,
When you're learning to sing, its Do, Re, Mi;
When you're learning to code, its G, D, B.
(background) G, D, B.

The first three letters just happen to be, G, D, B.

(background) G, D, B.

(Chorus)

G!,
GNU!, it's Stallman's hope,
D,
a break I set myself.
B,
debug that rotten code,
Run,
a far, far way to go.
Print,
to see what you have done,
Set,
a patch that follows print.
Quit,
and recompile your code - - -
That will bring it back to G,
D,
B,
<link>
(Resume from the Chorus)

感觉, 嗯, 很有气势