linux下c语言内存检测神器asan,专治各种疑难杂症

简介: linux下c语言内存检测神器asan,专治各种疑难杂症

最近工作中有地方嵌入式程序出现莫名其妙的问题,有时候正常的变量值都会突变了导致问题。


这问题还是偶然出现的神秘莫测,若没有对内存检测的神器,很难定位。


比如char buf[5], memcpy(buf,"12345678",8) ;明显超过了buf的范围,但程序竟正常运行不会报错,也没任何提示。


这里明细写出来是为了展现问题,但项目中那么多代码和文件且分散在各处,且有的可能是中间变量拷贝,比如memcpy(buf,buf1,len1),长度len1是变动的,比如取自后台应答报文中的某个值。那么这类问题,检查代码也是难看出来的。


这也说明对涉及内存操作的地方,一定要谨慎,考虑好值的合法性问题。


c语言是强大,但是操作太灵活就是怪兽啊,类似这类的bug防不胜防。搞的我都想用两周时间用go语言重构一版终端程序。


go语言高级语言,若类似这样的bug编译阶段都会过,比c语言应更安全和稳定。


c语言的类似这种很难发现的bug,有了asan神器,这类问题无处遁形。


对于asan,只有一个词能表达我的心情,那就是相见恨晚…asan你值得拥有,谁用谁知道。


ASAN(Address-Sanitizier)早先是LLVM中的特性,后被加入GCC 4.8,在GCC 4.9后加入对ARM平台的支持。因此GCC 4.8以上版本使用ASAN时不需要安装第三方库,通过在编译时指定编译CFLAGS即可打开开关。


使用也很简单,gcc工具链的编译选项中,


CFLAG加入选项 -fsanitize=address -fno-stack-protector -fno-omit-frame-pointer -fno-var-tracking -g1即可。


注意把libasan.so库随终端程序一块儿打包进去。libasan.so.1.0.0改名为 libasan.so.1随程序打包到lib库.


# -fsanitize=address:开启内存越界检测


# -fsanitize-recover=address:一般后台程序为保证稳定性,不能遇到错误就简单退出,而是继续运行,采用该选项支持内存出错之后程序继续运行,需要叠加设置ASAN_OPTIONS=halt_on_error=0才会生效;若未设置此选项,则内存出错即报错退出


# -fno-stack-protector:去使能栈溢出保护


# -fno-omit-frame-pointer:去使能栈溢出保护


# -fno-var-tracking:默认选项为-fvar-tracking,会导致运行非常慢


# -g1:表示最小调试信息,通常debug版本用-g即-g2


CFLAGS += -fno-stack-protector -fno-omit-frame-pointer -fno-var-tracking -g1


若出现堆栈溢出,内存溢出等问题,会立刻反应出来,如:




libasan.so库从哪获取? 默认gcc编译器4.9版本之后自带的有啦,美吧。


从交叉工具链里找出来即可。


比如我的工具链gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux.tar.bz2



更多用法,参见:


https://blog.csdn.net/hanlizhong85/article/details/78076668


https://blog.csdn.net/TSZ0000/article/details/96301184

相关文章
|
存储 缓存 文件存储
如何保证分布式文件系统的数据一致性
分布式文件系统需要向上层应用提供透明的客户端缓存,从而缓解网络延时现象,更好地支持客户端性能水平扩展,同时也降低对文件服务器的访问压力。当考虑客户端缓存的时候,由于在客户端上引入了多个本地数据副本(Replica),就相应地需要提供客户端对数据访问的全局数据一致性。
33251 201
如何保证分布式文件系统的数据一致性
|
设计模式 存储 监控
设计模式(C++版)
看懂UML类图和时序图30分钟学会UML类图设计原则单一职责原则定义:单一职责原则,所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变,那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原因。bad case:IPhone类承担了协议管理(Dial、HangUp)、数据传送(Chat)。good case:里式替换原则定义:里氏代换原则(Liskov 
36821 22
设计模式(C++版)
|
存储 编译器 C语言
抽丝剥茧C语言(初阶 下)(下)
抽丝剥茧C语言(初阶 下)
|
机器学习/深度学习 人工智能 自然语言处理
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
24905 16
|
机器学习/深度学习 弹性计算 监控
重生之---我测阿里云U1实例(通用算力型)
阿里云产品全线降价的一力作,2023年4月阿里云推出新款通用算力型ECS云服务器Universal实例,该款服务器的真实表现如何?让我先测为敬!
36824 15
重生之---我测阿里云U1实例(通用算力型)
|
SQL 存储 弹性计算
Redis性能高30%,阿里云倚天ECS性能摸底和迁移实践
Redis在倚天ECS环境下与同规格的基于 x86 的 ECS 实例相比,Redis 部署在基于 Yitian 710 的 ECS 上可获得高达 30% 的吞吐量优势。成本方面基于倚天710的G8y实例售价比G7实例低23%,总性价比提高50%;按照相同算法,相对G8a,性价比为1.4倍左右。
|
存储 算法 Java
【分布式技术专题】「分布式技术架构」手把手教你如何开发一个属于自己的限流器RateLimiter功能服务
随着互联网的快速发展,越来越多的应用程序需要处理大量的请求。如果没有限制,这些请求可能会导致应用程序崩溃或变得不可用。因此,限流器是一种非常重要的技术,可以帮助应用程序控制请求的数量和速率,以保持稳定和可靠的运行。
29949 52

热门文章

最新文章