GDB学习笔记

学习GDB调试的简单操作

资源全部来自实验楼
可自行去实验楼学习相关课程

安装GDB

# # 使用以下命令安装GDB
sudo apt-get install gdb	# # ubuntu

GDB的进入和退出

# # 编译并生成可执行文件
gcc source.c -o bugging -g
# # 进入调试界面
gdb bugging
(gdb)run # # 运行代调试程序
(gdb)quit  # # 退出

GDB常用命令

cmdabbraddi
listlprint code
backtracebt or whereprint stack
nextnexecute next line
stepsexecute one line once
finish-execute until finished
continueccontinue to execute
breakbset bps
info breakpointsshow the info of bps
deleteddelete bps
printpprint the value of exp
runrstart the program
untiluexecute until some line
infoiprint info
helphprint help

bps .abbr breakpoints

exp .abbr expression

在GDB命令行界面可以执行外部的Shell命令

# (gdb)!cmd
(gdb)!ls

从应用层面学习GDB的命令

  • 查看源文件

    • list 行号 显示某一行附近的代码

      (gdb)list 2 # # 查看第二行附近的代码
      
      • 输入后持续输入\n可遍历代码
      • 每次10行
    • list 函数名显示某个函数附近的代码

      (gdb)list main
      
    • 涉及多个源文件时

      (gdb)list filename:line
      (gdb)list filename:function
      
  • 设置断点

    • break用来设置断点

      • break 行号设置在行开始处

        break filename:line

      • break 函数名设置在函数开始处

        break filename:function

    • info breakpoints命令用于显示当前断点信息 信息如下

      NumTypeDispEnbAddressWhat
      断点号欢迎hit后动作是否启用存储中的位置源码中的位置
    • disable bp_num关闭指定断点

      disable 不指定参数 --> 关闭所有断点

    • enable bp_num启用指定断点

      enable 不指定参数 --> 启用所有断点

    • 断点启用的更多方式

      (gdb)enable once bp_num # # 断点hit一次之后关闭该断点
      (gdb)enable delete bp_num # # 断点hit一次之后删除该断点
      

      影响info breakpoints的Disp

  • 断点调试的一些命令

    • 打印变量

      (gdb)info locals  # # 打印当前函数的全部局部变量信息
      (gdb)print value  # # 打印某变量的值
      (gdb)print exp  # # 打印表达式的值
      
    • 启动程序

      (gdb)run # # 启动程序
      (gdb)run args # # 带主函数参数的启动程序
      
    • 单步命令

      (gdb)next # # 单步执行 函数调用当成一步
      (gdb)next N # # 单步执行N次
      (gdb)step # # 单步执行 函数调用会进入函数
      (gdb)step N # # 
      (gdb)continue # # 执行到下一个断点
      (gdb)until N # # 执行到第N行
      

      容易看出 list break step next info等指令高频

GDB函数栈

进程在内存空间会拥有一块叫做 stack 的区域,函数内部的局部变量、函数之间调用时参数的传递和返回值等等都会用到栈这种数据结构

  • 查看代调试程序的内存分布情况

    (gdb)info proc mappings
    
  • 查看函数调用栈的情况

    (gdb)backtrace
    (gdb)bt
    (gdb)where
    (gdb)info stack
    # # 以上命令有着相同输出
    (gdb)backtrace full
    (gdb)bt full
    (gdb)where full
    (gdb)info stack full
    # # 查看函数调用栈情况 同时打印局部变量的值
    
  • 函数调用过程中栈到底是怎么压入和弹出的?

总结

  • GDB的操作看起来不是很难 但是离开VSCLIONIDE的可视化界面的帮助,用GDB在命令行调试在现在看起来是一件很困难的事情
  • 要常加练习 这样有助于对程序设计的进一步精进
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值