GDB命令详解

发布于:2022-10-15 ⋅ 阅读:(322) ⋅ 点赞:(0)

编译gdb可调式文件,使用参数-g,举例如下

        gcc -g xx.c

载入编译文件

        gdb a.out

打断点

break/b 行号
break/b 函数名
执行在某个线程里打断点:break/b 56 thread 3 

删除断点

delete
用法:delete [breakpoints num] [range...]
delete可删除单个断点,也可删除一个断点的集合,这个集合用连续的断点号来描述。
例如:
delete 5 (5代表行数)
delete 1-10(1到10行的断点)
clear
用法:clear
    删除所在行的多有断点。
    clear location
clear 删除所选定的环境中所有的断点
clear location location描述具体的断点。
例如:
clear list_insert         //删除函数的所有断点
clear list.c:list_delet   //删除文件:函数的所有断点
clear 12                     //删除行号的所有断点
clear list.c:12             //删除文件:行号的所有断点
clear 删除断点是基于行的,不是把所有的断点都删除。

单步调试

n :执行下一行程序
s :执行下一行程序,如果遇到函数 直接跳入函数,跳出该函数使用fin/return

重新运行调试

        restart/r

查看info gdb信息

停止结束

        quit/q

对正在执行的程序进行调试

        以下三种方式皆可:
                1) gdb attach PID
                2) gdb 文件名 PID
                3) gdb -p PID
        结束方式:
                执行 detach 指令,使 GDB 调试器和程序分离;
                执行 quit(或 q)指令,退出 GDB 调试。

GDB反汇编

disassemble/disass  
当在oops里看到汇编指令偏移,如下图红色方框里的数值,其代表汇编指令偏移的数值,可以利用gdb的dissemble指令,看到反汇编,然后逐行找到编译个命令,定位到大概在函数的多少行。

gdb查看变量信息命令

print/p

GDB display命令(自动显示命令)

和print 命令一样,display 命令也用于调试阶段查看某个变量或表达式的值,它们的区别是,使用 display 命令查看变量或表达式的值,每当程序暂停执行(例如单步执行)时,GDB 调试器都会自动帮我们打印出来,而 print 命令则不会。

查看display的变量数:info display

            
删除自动打印:undisplay num...
            

继续执行

C(continue),不能是r,r代表restart,从头开始执行

查看线程信息

info threads
下图的*,表示当前在哪个上下文线程里
查看所有线程调用栈
thread apply all bt

gdb内执行shell指令

两种方式,shell command | !command.
第一种是用内置指令shell.
第二种是用特殊符号!开头.
好处就是可以边调试边看源码,甚至进行一些其他操作.
示例:
    !less a.cpp
    # 查看代码
    !pwd
    #查看进来时的工作目录
    c && !ping 192.168.1.155
    #测试发包结构

修改调试的变量值

        print num = x

跳到指定行

        jump number(行号)

        注意:跳过的不执行

gdb指定在某个文件打断点

b file.c:22

until(u) 执行一行程序

若此时程序是在 for/while/do loop 循环的最后一行,则一直执行到循环 结束后的第一行程序后停止
在没有循环的地方,可以直接指定到多少行,u line
如:
    u 53

examine(x

打印内存地址值,格式如下:
x/[ number][ format] < addr>
其中number,format都是可选参数
addr:
为查看变量的内存地址
number: 一个正整数,表示从当前地址向后显示几个地址的内容,如
x/24 0x400c90
表示查看0x400c90到向后0x400c90+24的内容
format:显示的格式不是查看的格式。和c语言中的格式缩写一样,如
d:整数integer
s:字符串string
c:字符char
u:无符号整数 unsigned integer
o:八进制格式显示变量
x:十六进制格式
f: 浮点数格式float

加载符号表命令

symbol-file [符号表文件]

条件断点

watch expr if cond
break expr if cond

显示当前行号

info line

focus显示命令模式

    
注意:
切换到 focuse模式后,箭头键被用来移动上方的代码窗口。 如果需要在调试窗口切到历史命令,可以用
ctrl+p previous
ctrl+n next
ctrl+b back
ctrl+f forward
(gdb) info win
src (31 lines) <has focus>
cmd (17 lines)
(gdb) fs cmd
Focus set to cmd window.
(gdb) info win
src (31 lines)
cmd (17 lines) <has focus>
此时,gdb focus在cmd window,箭头会作用于cmd window, 想切换回 src window,输入 fs src 即可。
关闭 : Ctrl+X+A

断电条件判断(字符比较)

b 4124 if strcmp(tn->str,"exit") == 0

gdb commonds 命令

给断点附加一些 “自动化” 执行的命令,当程序运行到断点并停住时,就会自动执行这些预先设定好的命令, 达到“自动化调试”的目的。
commands <break_number>
> ...command_list...
> end
break_numer:是断点号
end: 结束commands 命令
举例: 遇到断点,自动打印调用栈
(gdb) b free(第一个断点,使用commands时,可以省略1断点号)
Breakpoint 1 at 0x7fba758d54 (3 locations)
(gdb) commands
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>bt
>c
>end
(gdb) b malloc(为第二个断点)
Breakpoint 2 at 0x7fba758774 (3 locations)
(gdb) commands 2
Type commands for breakpoint(s) 2, one per line.
End with a line saying just "end".
>bt
>c
>end
(gdb) c

查看变量的类型:(whatis)

        (gdb) whatis i
                type = u_int8_t
        (gdb)  whatis  u_int8_t
                type = __uint8_t
        (gdb) whatis __uint8_t
                type = unsigned char

查看函数传参参数

      info/i args

gdb return finish

1.如果想要立即中断当前函数运行并返回,用return,当前函数的剩余语句将不被执行。(return可带参数,可以此随意设定当前函数的返回值)
2.如果想让程序执行到当前函数返回之后停止,用finish,当前函数的剩余语句将会正常运行。

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到