当前位置: 首页 > news >正文

Linux开发工具(gdb/cgdb篇)

目录

1.模式

-g选项,让最后形成的可执行程序,添加调试信息---dabug模式!

程序要调试,必须debug模式!也就是说明编译时要加-g选项

2.安装gdb

3.快速认识gdb

输入quit可以退出 查看代码list b打 断点 r运行 c运行结束

4.解决一些gdb难用的问题

cgdb!

5.gdb/cgdb命令

常见使用

1.b 打断点 b 行号 info b查看断点 d + 断点编号 删除断点 r运行程序

gdb不退出,断点变化依次递增

n和s bt查看当前函数栈帧 finish执行到当前函数返回

调试的本质是什么:

6.三个debug技巧


1.模式

软件开发发布的模式有两种

1.debug模式

2.release模式

debug一般是开发期间使用的

release一般是发布期间用的---测试---上线

Windows下我们编译好程序,可以直接调试

linux下下载我们编程好的代码,无法直接调试

gcc/g++默认的工作模式是release模式

-g选项,让最后形成的可执行程序,添加调试信息---dabug模式!

程序要调试,必须debug模式!也就是说明编译时要加-g选项

在Makefile里面加个-g

1 SRC=$(wildcard *.c) 2 OBJ=$(SRC:.c=.o) 3 BIN=processbar 4 5 $(BIN):$(OBJ) 6 gcc -o $@ $^ 7 %.o:%.c 8 gcc -c $< -std=c99 -g 9 10 .PHONY: 11 clean: 12 rm -f $(OBJ) $(BIN)
[user1@iZ5waahoxw3q2bZ processbar]$ make gcc -c main.c -std=c99 -g gcc -c process.c -std=c99 -g gcc -o processbar main.o process.o

原来make之后的processbar

-rwxrwxr-x 1 user1 user1 9024 Apr 16 13:32 processbar

之后的

-rwxrwxr-x 1 user1 user1 12576 Apr 16 15:16 processbar

明显发现体积增大了

可以发现多了好几个debug

[user1@iZ5waahoxw3q2bZ processbar]$ readelf -S processbar | grep -i debug [28] .debug_aranges PROGBITS 0000000000000000 00001095 [29] .debug_info PROGBITS 0000000000000000 000010f5 [30] .debug_abbrev PROGBITS 0000000000000000 00001669 [31] .debug_line PROGBITS 0000000000000000 00001860 [32] .debug_str PROGBITS 0000000000000000 000019b4


gdb携带调试信息的exe

2.安装gdb

sudo yum install -y gdb

3.快速认识gdb

1 #include <stdio.h> 2 3 int Sum(int s, int e) 4 { 5 int result = 0; 6 for(int i = s; i <= e; i++) 7 { 8 result += i; 9 } 10 return result; 11 } 12 int main() 13 { 14 int start = 1; 15 int end = 100; 16 printf("I will begin\n"); 17 int n = Sum(start, end); 18 printf("running done, result is: [%d-%d]=%d\n", start, end, n); 19 return 0; 20 }
[user1@iZ5waahoxw3q2bZ 26-4-16]$ gcc mycode.c -o mycode mycode.c: In function ‘Sum’: mycode.c:6:5: error: ‘for’ loop initial declarations are only allowed in C99 mode for(int i = s; i <= e; i++) ^ mycode.c:6:5: note: use option -std=c99 or -std=gnu99 to compile your code [user1@iZ5waahoxw3q2bZ 26-4-16]$ gcc mycode.c -o mycode -std=c99 [user1@iZ5waahoxw3q2bZ 26-4-16]$ ./mycode I will begin running done, result is: [1-100]=5050
[user1@iZ5waahoxw3q2bZ 26-4-16]$ ./mycode No symbol table is loaded. Use the "file" command.

需要加-g进入debug模式

[user1@iZ5waahoxw3q2bZ 26-4-16]$ gcc mycode.c -o mycode -std=c99 -g

重新gdb mycode

输入quit可以退出

[user1@iZ5waahoxw3q2bZ 26-4-16]$ gdb mycode GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>... Reading symbols from /home/user1/linux-learning/linux/26-4-16/mycode...done. (gdb) quit

查看代码list

b打 断点

(gdb) b 19 Breakpoint 1 at 0x4005d9: file mycode.c, line 19.

r运行

(gdb) r Starting program: /home/user1/linux-learning/linux/26-4-16/mycode I will begin running done, result is: [1-100]=5050 Breakpoint 1, main () at mycode.c:19 19 int n = Sum(start, end); Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.3.x86_64

c运行结束

(gdb) c Continuing. [Inferior 1 (process 9036) exited normally]

4.解决一些gdb难用的问题

解决gdb难用的问题---

cgdb!

推荐安装cgdb:

• Ubuntu: sudo apt-get install -y cgdb

• Centos: sudo yum install -y cgdb

5.gdb/cgdb命令

常见使用

开始: gdb binFile

退出: ctrl + d 或 quit 调试命令

命令 作用 样例 list/l 显示源代码,从上次位置开始,每次列出10行 list/l 10 list/l 函数名 列出指定函数的源代码 list/l main list/l 文件名:行号 列出指定文件的源代码 list/l mycmd.c:1 r/run 从程序开始连续执行 run n/next 单步执行,不进入函数内部,逐过程 F10 next s/step 单步执行,进入函数内部, 逐语句 F11 step
break/b [文件名:]行号 在指定行号设置断点 break 10 break test.c:10 break/b 函数名 在函数开头设置断点 break main info break/b 查看当前所有断点的信息 info break finish 执行到当前函数返回,然后停止 finish print/p 表达式 打印表达式的值 print start+end p 变量 打印指定变量的值 p x
set var 变量=值 修改变量的值 set var i=10 continue/c 从当前位置开始连续执行程序 continue delete/d breakpoints 删除所有断点 delete breakpoints delete/d breakpoints n 删除序号为n的断点 delete breakpoints 1 disable breakpoints 禁用所有断点 disable breakpoints enable breakpoints 启用所有断点 enable breakpoints info/i breakpoints 查看当前设置的断点列表 info breakpoints
display 变量名 跟踪显示指定变量的值(每次停止时) display x undisplay 编号 取消对指定编号的变量的跟踪显示 undisplay 1 until X行号 执行到指定行号 until 20 backtrace/bt 查看当前执行栈的各级函数调用及参数 backtrace info/i locals 查看当前栈帧的局部变量值 info locals quit 退出GDB调试器 quit

开始

[user1@iZ5waahoxw3q2bZ 26-4-16]$ cgdb mycode

除了之前那些命令

1.b 打断点

(gdb) b mycode.c:20 Breakpoint 1 at 0x4005de: file mycode.c, line 20. (gdb) b mycode.c:main Breakpoint 2 at 0x400595: file mycode.c, line 14. (gdb) b 17 Breakpoint 3 at 0x4005ad: file mycode.c, line 17.

b 文件:行号

b 文件:函数名

也可以直接打断点

b 行号
info b查看断点
(gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004005de in main at mycode.c:20 2 breakpoint keep y 0x0000000000400595 in main at mycode.c:14 3 breakpoint keep y 0x00000000004005ad in main at mycode.c:17

Num断点编号

d + 断点编号 删除断点

不能d+行号

(gdb) d 17 No breakpoint number 17.

只能根据断点编号删

(gdb) d 2 (gdb) info b Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004005de in main at mycode.c:20 3 breakpoint keep y 0x00000000004005ad in main at mycode.c:17 (gdb) d 1 (gdb) d 3 (gdb) info b No breakpoints or watchpoints.
r运行程序
(gdb) run Starting program: /home/user1/linux-learning/linux/26-4-16/mycode I will begin running done, result is: [1-100]=5050 [Inferior 1 (process 9066) exited normally] Missing separate debuginfos, use: debuginfo-install glibc-2.17-326.el7_9.3.x86_64
gdb不退出,断点变化依次递增
(gdb) b 19 Breakpoint 4 at 0x4005d9: file mycode.c, line 19. (gdb) info b Num Type Disp Enb Address What 4 breakpoint keep y 0x00000000004005d9 in main at mycode.c:19

vs2022中:f10:逐 过程 f11:逐语句

n和s

next/n:逐过程
step/s:逐语句,gdb会自动记录最新的一条输入指令

bt查看当前函数栈帧

(gdb) bt #0 Sum (s=1, e=100) at mycode.c:6 #1 0x00000000004005bc in main () at mycode.c:20

finish执行到当前函数返回

(gdb) finish Run till exit from #0 Sum (s=1, e=100) at mycode.c:6 0x00000000004005bc in main () at mycode.c:20 Value returned is $1 = 5050

值会存到寄存器然后返回

p+变量:打印指定变量的值


int n = Sum(start, end);
执行两个动作:一个call,一个mov是将返回值从寄存器存储到变量n中

断点可以被使能!(被启用和禁用)
Enb使能

disable+Num:禁用断点
enable+Num:启用断点


调试的本质是什么:

1.找到问题---找到问题的命令 断点的本质,是把代码进行块级别划分,以块为单位进行快速定位区域!
2.查看代码上下文 finish->确认问题是否在函数内
until->局部区域快速执行
自己解决问题

c:从当前位置开始连续执行程序
finish:执行到当前函数返回,然后停止
until+行号:跳转到指定行


display+变量名:跟踪显示指定变量的值(每次停止时)
undisplay+编号:取消对指定编号的变量的追踪显示

info locals查看当前栈帧的局部变量值

6.三个debug技巧

三个小技巧:
1.watch
执行时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运行期间的值发生变化,GDB会暂停程序的执行,并通知使用者
• 如果你有⼀些变量不应该修改,但是你怀疑它修改导致了问题,你可以watch它,如
果变化了,就会通知你.
• 监视变量的变化

2.set var确定问题原因
更改⼀下标志位,假设我们想得到+-result

(gdb) set var flag=1 #更改flag的值,确认是否是它的原因

3.条件断点
• 条件断点添加常见两种方式:1.新增2.给已有断点追加
• 注意两者的语法有区别,不要写错了。
• 新增:b行号/文件名:行号/函数名 if i == 30 (条件)
• 给已有断点追加:condition 2 i==30 ,其中2是已有断点编号,没有if
• Cgbd分屏操作 ESC 进入代码屏,i回到gdb 屏

http://www.jsqmd.com/news/652573/

相关文章:

  • 排序算法入门:冒泡、选择、插入排序详解
  • 如何打造无网络环境下的iScroll开发参考方案:完整离线文档指南
  • Python 爬虫实战:精准抓取母婴电商平台数据,深入分析用户评价洞察市场趋势
  • 如何快速上手Remmina:面向新手的10个简单设置技巧
  • 如何优化Mantine Checkbox组件交互体验:从默认到高级的完整指南
  • Davinci代码是如何实现Autosar-CanTsyn模块功能的
  • 如何使用ONNX Simplifier优化模型:生产环境部署的完整指南
  • 别再手动调亮度了!用Python+OpenCV直方图均衡化,5分钟让模糊图片变清晰(附完整代码)
  • 探索ComfyUI-WanVideoWrapper:解密AI视频生成的核心架构与实战应用
  • 避坑指南:ESP32连接多个I2C传感器(OLED、BH1750)的常见问题与解决方法
  • TongWeb应用部署实战:从单机到集群的路径选择与避坑指南
  • 别让Simulink生成的代码拖慢你的嵌入式系统:手把手教你配置这7个关键优化选项
  • OV5640摄像头模组选型与二次开发避坑指南:DVP vs MIPI接口到底怎么选?
  • 从时序到中断:手把手教你用C51单片机定时器实现一个精准的1秒LED闪烁
  • 如何利用Bootstrap实现高效用户体验监控:从行为收集到数据分析的完整指南
  • 别再问工厂要什么文件了!用Altium Designer 19生成Gerber文件,这份保姆级教程一次讲透
  • 微信小程序下载PDF的‘隐藏’路径揭秘:wx.env.USER_DATA_PATH到底存哪了?怎么删?
  • 手把手教你打造个性化动态彩色二维码生成工具(GUI版)
  • 别再死记硬背LTL公式了!用Python+Spot库5分钟搞定互斥锁与进程公平性验证
  • 终极指南:Mantine TypeScript集成实现类型安全组件开发全流程
  • 敬老院管理|基于springboot + vue敬老院管理系统(源码+数据库+文档)
  • XUnity.AutoTranslator深度解析:如何用5层架构重构Unity游戏本地化体验
  • 如何快速掌握Mint语言编译原理:从源码到JavaScript的转换全过程
  • 嵌入式Linux--全志V3s--NOR Flash分区与文件系统实战(一)
  • 计算机毕业设计:Python海洋与淡水渔业资源监控大屏 Flask框架 数据分析 可视化 数据大屏 大数据 机器学习 深度学习(建议收藏)✅
  • 如何利用TypeScript提升clean-code-javascript项目质量:静态类型检查的7大优势
  • 终极指南:PMD与元编程集成如何实现代码生成质量管控
  • Python 爬虫实战:批量抓取免费代理IP地址,提升网络爬虫效率与匿名性
  • 避坑指南:在安卓Termux里用QEMU装Win11最容易踩的5个雷(附解决方案)
  • 镜像视界·普陀研究院:厘米级无感定位,开启全域无设备空间智能革命