Linux C GDB命令详解大全

目录

编译可调试文件

载入编译文件

打断点

删除断点

单步调试

重新运行调试

查看info gdb信息

停止结束

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

反汇编

查看变量信息命令

display命令(自动显示命令)

继续执行

查看线程信息

gdb内执行shell指令

修改调试的变量值

跳到指定行

指定在某个文件打断点

until(u) 执行一行程序

examine(x)

加载符号表命令

条件断点

显示当前行号

focus显示命令模式

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

commonds 命令

查看变量的类型:(whatis)

查看函数传参参数

gdb return finish

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信息

        info registers        :查看当前寄存器的值
        info args               :查有当前函数参教的值
        info locals             :查看当前局部变量的值
        info frame             :查看当前栈的详细信息
        info variables        :查看程序中的变量符号
        info functionscsd   : 查看程序中的函数符号

停止结束

        quit/q

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

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

反汇编

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

查看变量信息命令

print/p

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(行号)

        注意:跳过的不执行

指定在某个文件打断点

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

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
删除:
​​​​​​​        清空断点的命令,输入commands num后,直接输入end即可
        (gdb)commands 1
                >   end

查看变量的类型:(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,当前函数的剩余语句将会正常运行。

gdb 进程传参

--args 

例如:

        gdb --args ./trdp-md-test caller 

        trdp-md-test:进程

        caller :参数

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

突破边界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值