基于Linux系统下的C语言程序错误及常见内存问题调试方法教程(嵌入式-Linux-C语言)

学习完C语言的内容过后,我们在来学习下如何在程序运行报错的情况下怎么快速定位到代码错误的地方,之前也给大家讲过一种方法就是通过gbd进行调试,不知到各位友友还有印象没,没记住也没有关系,我们今天将在为大家温习一遍,及教各位怎么去处理常见的一些程序错误和内存错误问题,那我们开始吧!

1、内存常见问题调试方法

1.1、C语言程序错误

1.1.1 语法错误

(1)错误(error):语法错误,无法生成对应二进制文件

(2)告警(warnning):语法告警,语法有可能会出现问题,不影响二进制文件的生成,程序运行可能会出错

1.1.2 逻辑错误

程序运行结果和预期不符

1.1.2.1 打印法

在可能出错的位置加入打印,查看对应的结果是否与预期一致,如果一致在后续的代码中继续加入打印,直到不满预期为止,则完成对错误的定位

1.1.2.2 gdb调试

根据问题单步调试,直到找到错误为止

1、编译时,加入-g选项,允许gdb调试

gcc filename.c -g

2、调试生成的二进制程序

gdb ./a.out

3、设置断点

b 行号/函数名

4、运行代码

r

5、输入命令调试

n 分布执行

c 执行到下一处断点为止

s 进入函数内调试

p 查看变量的值

q 退出调试

对于程序错误,我们可以通过上述两种方法很快定位到错误的来源,一方面如果是语法报错,我们可以根据系统提示的行数找到对应的错误,逻辑错误也可以快速通过这两种方法找出来。

但是下面这个内存问题,一般编译下不会报错,时现时不现的问题,可能是最麻烦的,如果还有很多代码,很多文件,那通过上面的方法是很困难的,那该怎么办呢,就接着跟着博主一起来看看如何解决吧:

2、内存问题调试

2.1 内存越界(内存溢出)

现象:代码会出现偶现性、必现性的BUG,程序代码不稳定,数据被莫名其妙的修改

问题原因:指针的越界访问,特别是字符串越界访问

示例:

  • strcpy、strcat、strcmp、sprintf这些都是有越界风险的函数
  • 推荐使用strncpy、strncat、strncmp、snprintf替换之前有越界风险的函数
cpp 复制代码
strncpy(dst,src,sizeof(dst)-1);
替换
strcpy(dst,src);

2.2 段错误调试

现象:程序运行后报错 segmentation fault(core dumped)

**问题原因:**错误使用指针,访问非法空间

解决方法:

**打印法:**加入打印,前一句能打印,后一句无法打印,证明中间代码出现错误

gdb调试段错误:

(1)编译时代码加入-g选项

(2)程序代码段错误时,会产生core文件

(3)修改core配置文件(改一次),并使用命令允许生成core文件

ulimit -c unlimited

(4)使用gdb调试段错误

gdb a.out core

2.3 内存泄漏

现象:长时间运行代码,剩余内存空间越来越少

问题原因:内存泄漏,申请的空间没有被释放,所以不断有空间被申请,造成可用空间越来越小。

解决方法:

valgrind

valgrind --tool=memcheck --leak-check=full ./a.out

安装valgrind工具

1、让虚拟机能够上网:

1、打开"虚拟机" -> "设置" -> "网络适配器" -> 选择"NAT模式" -> 点击"确定"

2、设置ubuntu的IP地址为自动获取IP地址:

1.打开网卡配置文件

sudo vim /etc/network/interfaces

修改文件内容:

auto lo

iface lo inet loopback

auto ens33

iface ens33 inet dhcp

2、重启虚拟机

sudo shutdown -r now

3、配置apt-get工具集

1、点击"Ubuntu Software Center"

2、右键图标选择"Software & Updates"

3、源选择 aliyun

4、点击choose

5、输入密码1

6、点close(不能点revert)

7、终端输入:

sudo apt-get autoclean //清除旧源

sudo apt-get update //更新新源

sudo apt-get install -f //重建软件源依赖关系

4、安装valgrind

sudo apt-get install valgrind

valgrind --help

valgrind --version

以上针对顿错误和内存泄漏快速定位的方法,也已经教给各位了,可以按照操作步骤,先配置好,在去编译编译,看看代码是否有这样的问题。

这就是我们在遇到问题时常见的一些解决方法,只有找到了问题,才有办法去解决,好了,今天给大家的分享就到这里了,觉得有帮助的友友,可以点点赞,收藏收藏,制作不易,感谢!

相关推荐
爱编码的小八嘎2 小时前
c语言对话-1.auto_ptr再回忆
c语言
小温冲冲2 小时前
QPixmap 详解:Qt 中的高效图像处理类
开发语言·图像处理·qt
面汤放盐2 小时前
企业权限--系统性方案探究
java·开发语言
悟能不能悟2 小时前
java Date转换为string
java·开发语言
松涛和鸣2 小时前
DAY63 IMX6ULL ADC Driver Development
linux·运维·arm开发·单片机·嵌入式硬件·ubuntu
菜宾2 小时前
java-redis面试题
java·开发语言·redis
W_a_i_T2 小时前
【Coding日记】菜鸟编程C语言100例——第一题
c语言·学习·编程思维·菜鸟编程
帅得不敢出门2 小时前
Android Framework在mk中新增类似PRODUCT_MODEL的变量并传递给buildinfo.sh及prop属性中
android·linux·前端
程序员_大白3 小时前
区块链部署与运维,零基础入门到精通,收藏这篇就够了
运维·c语言·开发语言·区块链