gdb代码调试

@TOC

gdb代码调试

1. 软件发布形式

一般的软件发布有两种:

debug:可以被调试,形成的可执行程序会添加调试信息—>用户不需要+体积大
release:形成的可执行程序会去掉调试信息(面向用户)
调试时使用的是debug模式

  • gcc/g++编译时动态链接,默认release发布
  • gcc -o $@ $^ -g -g以debug方式发布
    可执行呈现的格式->ELF
    redelf

2. 安装gdb

yum install -y gdb:安装gdb调试软件

3. 调试命令

l 行号/函数名/文件名 显示代码内容(记录最近一次操作,下方向键)
r 重新运行
c (continual)运行到下一个断点
b (Break point)打断点——进行范围定位排除
b 行号/内容打断点
b 文件名:行号
info b用来查看断点
d 断点编号删除断点
disable 断点编号 禁用断点
enable 断点编号 使能(禁用/开启)断点

n (next)逐过程
s(step)逐语句

逐语句( ;为分隔符):进入一个函数(对应VS中的F11)
逐过程:每一行看作一个整体,把一行看作一个整体,包括函数。

p +变量/&地址 显示变量的地址和内容,相当于监视;
display 变量名/取地址常显示变量的地址和内容;
undisplay +编号 取消常显示变量的地址和内容;

  • 范围查找(从上至下依次扩大范围)
    c (continual)运行到下一个断点
    fin(finish):将一个函数运行结束就停下来
    until 行号:在一个范围内,直接运行到指定行
    bt :查看调用堆栈

set var name=value:修改一个变量的内容,不用改代码就像多分支测试;
92c8fef61e8a54bbe7d94e268ffe8ffb_MD5

4. 调试本质:

  • 找到问题(二分思想范围查找,局部逐行查找),以上所有指令都是为了找到问题;
  • 解决问题(上下文代码)
👀