1.gdb 可执行文件
例子:gdb one
2.gdb attach pid
例子:gdb attach 123
3.set args 参数
例子: set args 1 2 3
4.info args 查看参数
5.info locals :查看本地变量
6. next:源码级别不过
7.nexti:汇编代码级别不过
8:gdb -tui 可执行文件,layout split分割源码和汇编窗口
9.step:源码级别步入
10:stepi: 汇编级别步入
11.p/[o/x/d/u/t/f/a/i/c/s/z] ( 变量/$寄存器)
0:八进制格式
x:16进制格式
d:十进制格式
u:无符号十进制格式
t:二进制格式
f:浮点型
a:地址
i:汇编,用在x命令中
c:字符
s:字符串
z:0填充的十六进制
例子:p/x $eax
12. x/[长度.格式.单位] 内存地址:用来查看从某个地址开始的n个数据,并且单位数据以某种格式展示.
b:单位为1字节
h:单位为半字
w:单位为一个字
g:单位为8个字节
例子 :x/8xb 0x123
13.break 函数名
例子:break main.main
14.break *地址
例子:break 0x123
15.break 文件名:行号
例子:break /users/one.go:13
16 break 断点 if 表达式
例子:break one.go:13 if i==3
16.tbreak:是临时断点,只断一次点,其它和break一样
17.info registers :查看寄存器
18.display 变量:自动打印变量
19.info threads :查看所有线程
20.thread n:切换线程到线程序号n
例子:thread 3
21.info goroutines:查看所有的goroutine
22:goroutine n :切换到goroutine n
例子:goroutine 3
23.backtrace :查看调用栈
24.frame n:切换到栈n
例子:frame 5
26.up:切换到上一个frame
27.down:切换到下一个frame
28.set 变量=值
例子:set a=3
29. set 寄存器=值
例子:set $eax=33
30. set *地址=值 :更改内存值
例子:set *0x7fdffbd0=1:
31.set scheduler-locking on:多线程调试,设置每次只能有一个线程运行
32.find [/SIZE-CHAR] [/MAX-COUNT] START-ADDRESS, END-ADDRESS, EXPR1 [, EXPR2 ...]:内存搜索字符串
33.record后,gdb可以逆向调试
34.一般不知道如何使用命令,可以百度,或者是help 命令,要善于使用tab自动补全
35.生成核心存储文件
help ulimit :查看帮助
ulimit -c 核心存贮文件大小大小 :默认核心存储文件大小是没有限制的
ulimit -c unlimited :设置核心存贮文件的大小为无限
gdb 调试文件后 ,用命令 :generate-core-file 生成核心存储文件
调试核心存储文件 : gdb 可执行文件名 该可执行文件生成的核心存储文件名
36. info proc mappings :当调试的程序运行后查看该程序的内存映射
37.return 函数即使没有执行完,也直接返回
38.finish 执行完当前函数并返回
39.list 函数 或者 list 显示源码,在未执行前显示文件位置
40.pwd:查看当前工作目录
41.step n,stepi n,nexti n, next n, continue n:连续执行n次
42. command 断点号 //断点触发时,执行命令,一般用于打印变量
43.(gdb) command 1
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>print x
>end
44.def steprefresh
step
refresh
end
上面为定义一个新的命令steprefresh
45.set auto-load safe-path /
46.set disassembly-flavor intel :设置汇编为intel格式
47.监测点
watch //为表达式(变量)expr设置一个观察点。一量表达式值有变化时,马上停住程序。
rwatch //当表达式(变量)expr被读时,停住程序。
awatch //当表达式(变量)的值被读或被写时,停住程序。
info watchpoints //列出当前所设置了的所有观察点。
经验:观察某个变量是否变化,被读或者被写,由于变量只在某一个作用域,可以获取变量的地址,然后观察。
比如:观察examined_rows变量神马时候被修改
(1).p &examined_rows,得到地址
(2).watch *(ha_rows *) 0x7ffec8005e28,则可以观察这个变量的变化情况。
48.undisplay //取消自动打印
49.注意:默认编译的时候,调试过程是看不见宏的值的,编译时候需要给选项。-g3
50.thread apply all command //所有线程都执行命令打印栈桢
比如:thread apply all bt //所有线程都打印栈桢
51.show scheduler-locking :显示调度锁
52.set scheduler-locking off:关闭调度锁
53.non-stop模式(7.0以后的版本支持)
set target-async 1
set pagination off
set non-stop on
gdb启动了不停模式,除了断点有关的线程会被停下来,其他线程会执行。
54.信号
(1).singal 发送信号
假定你的程序已将一个专用的 SIGINT(键盘输入,或CTRL-C;信号2)信号处理程序设置成采取某个清理动作,
要想测试该信号处理程序,你可以设置一个断点并使用如下命令:
(gdb) signal 2
(2).handle 拦截信号
Handle命令可控制信号的处理,他有两个参数,一个是信号名,另一个是接受到信号时该作什么。几种可能的参数是:
* nostop 接收到信号时,不要将它发送给程序,也不要停止程序。
* stop 接受到信号时停止程序的执行,从而允许程序调试;显示一条表示已接受到信号的消息(禁止使用消息除外)
* print 接受到信号时显示一条消息
* noprint 接受到信号时不要显示消息(而且隐含着��停止程序运行)
* pass 将信号发送给程序,从而允许你的程序去处理它、停止运行或采取别的动作。
* nopass 停止程序运行,但不要将信号发送给程序。
比如:
handle SIGPIPE stop print //截获SIGPIPE信号,程序停止并打印信息
handle SIGUSR1 nostop noprint //忽略SIGUSR1信号
info target:查看调试进程的相关信息,包括入口地址,段地址等