固执无罪,梦想无价

|

StimuMing

园龄:4年5个月粉丝:0关注:2

2022-03-16 18:14阅读: 77评论: 0推荐: 0

GDB(实验楼转)

如果要调试程序,首先需要在gcc编译可执行程序时加上-g参数

gcc bugging.c -o bugging -g -m32

其中-m32表示编译为32位,默认编译根据操作系统决定。如果所在环境编译报错,请安装libc6-dev-i386后再次编译:

sudo apt-get install llibc6-dev-i386

然后输入gdb bugging进入gdb即可调试bugging程序。

GDB调试命令行界面使用技巧

部分 gdb 常用命令一览表:

命令 简写形式 说明
list l 查看源码
backtrace bt、where 打印函数栈信息
next n 执行下一行
step s 一次执行一行,遇到函数会进入
finish 运行到函数结束
continue c 继续运行
break b 设置断点
info breakpoints 显示断点信息
delete d 删除断点
print p 打印表达式的值
run r 启动程序
until u 执行到指定行
info i 显示信息
help h 帮助信息

当然,可以使用help command查看命令的用法

在gbd命令行界面可以执行外部的shell命令:

!shell命令
!pwd

查看源码(list)

  • list 行号,显示某一行附近的代码
  • list 文件名:行号:显示某一个文件某一行附近的代码,用于多个源文件的情况
  • list函数名:显示某个函数附近的代码
  • list 文件名:函数名:显示某一个文件某个函数附近的代码,用于斗个源文件的情况。

断点(break)

设置断点

  • break 行号,断点设置在该行开始处,注意:该行代码未被执行
  • break 文件名:行号,适用于有多个源文件的情况。
  • break 函数名,断点设置在该函数的开始处,断点所在行未被执行
  • break 文件名:函数名,函数名,适用于有多个源文件的情况。

查看断点信息:

info breakpoints命令用于显示当前断点信息。

其中每一项的信息如下表所示:

Num Type Disp Enb Address What
1 breakpoint keep y 0x0804844c in main at bugging.c:19
该编号可以多为delete/enable/disable/等控制断点命令的参数 代表断点类型,一般为breakpoint 代表断点被命中后,该断点保留(keep)、删除(del)还是关闭(dis) 代表断点是开(y)还是关(n) 代表改短点出虚拟内存的地址 代表该断点在源文件中的信息

删除断点

delete命令用于删除断点。

  • delete Num,删除指定断点,断点编号可通过info breakpoints获得
  • delete不带参数,默认删除所有断点。

关闭和启用断点

disable命令和enable命令分别用于关闭和启用断点:

  • disable Num,关闭指定断点,断点编号可通过info breakpoints获得
  • disable,不带任何参数,默认关闭所有断点。
  • enable Num,启用指定断点,断电编号可通过info breakpoint获得
  • enable,不带任何参数,默认启用所有断点

断点启用的更多方式

enable命令还可以用来设置断点被执行的次数,比如当断点设在循环中的时候,某断点可能被多次命中。

  • enable once Num,断点hit一次之后关闭该断点
  • enable delete Num,断点hit一次之后删除该断点

这两个命令影响的是 info breakpoints 的 Disp 列,表示该断点被命中之后的行为。

断点调试的一些命令

  1. 打印变量

调试的过程中需要观察变量或者表达式的值,所以先介绍两个基本的显示变量值的命令:

  • info locals

    打印当前断点处所在函数的所有局部变量的值,不包括函数参数。

  • print 变量或表达式

    打印表达式的值,可显示当前函数的变量的值、全局变量的值等

    print/FMT 可以控制打印的格式,常见的有x(十六进制)、t(二进制)、c(显示为字符)等。

  1. 启动程序

run 命令用于启动待调试程序,并运行到断点处停下。

  • run

    不带任何参数,启动待调试程序,不传递参数。

  • run 参数

    有些程序需要跟参数,直接带上参数列表即可,会传递给 main 函数的 argc、argv 变量。

  1. 单步命令

next, step, finish, continue, until 用于控制整个调试过程中,程序执行的流程。

  • next

    next 单步执行,函数调用当做一条指令,不会进入被调用函数内部

    next N,表示单步执行N次

  • step

    step 单步执行,会进入到函数调用内部

    step N,表示单步执行N次

  • finish

    执行程序到当前函数结束

  • continue

    执行程序到下个断点

  • until

    until N,执行程序到源代码的某一行

函数与函数栈

  • info proc mappings可以查看待调试进程的内存分布情况
  • backtrace查看函数调用栈的情况

backtrace、where、info stack

这三个命令都可以查看函数的调用情况

backtrace full、where full、info stack full

这三个命令查看函数调用情况的同时,打印所有局部变量的值

  • 栈帧

#1 是 main 函数用到的栈空间,这一部分可以称之为 main 函数的 stack frame

#0 是 foo 函数用到的栈空间,同样可称之为 foo 函数的 stack frame,0 代表当前执行停在 foo 函数内

可以得到函数调用关系为,main 调用 foo

  • info frame Num查看某个函数栈帧的详细信息
posted @   StimuMing  阅读(77)  评论(0编辑  收藏  举报
历史上的今天:
2021-03-16 线程demo_C++
2021-03-16 自动化部署项目hook
2021-03-16 关于QByteArray的toPercentEncoding()函数
2021-03-16 所见即所得_Typora及用法
2021-03-16 Hello,博客园
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起