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

相关文章
|
3月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
276 0
Linux内存问题排查命令详解
|
11月前
|
缓存 Linux
linux 手动释放内存
在 Linux 系统中,内存管理通常自动处理,但业务繁忙时缓存占用过多可能导致内存不足,影响性能。此时可在业务闲时手动释放内存。
514 17
|
8月前
|
存储 监控 Linux
Linux: 检测磁盘坏块 你得会吧!
Linux: 检测磁盘坏块 你得会吧!
459 19
Linux: 检测磁盘坏块 你得会吧!
|
7月前
|
缓存 Linux 数据安全/隐私保护
Linux环境下如何通过手动调用drop_caches命令释放内存
总的来说,记录住“drop_caches” 命令并理解其含义,可以让你在日常使用Linux的过程中更加娴熟和自如。
1216 23
|
9月前
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
296 27
|
10月前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
392 48
|
10月前
|
缓存 NoSQL Linux
Linux系统内存使用优化技巧
交换空间(Swap)的优化 禁用 Swap sudo swapoff -a 作用:这个命令会禁用系统中所有的 Swap 空间。swapoff 命令用于关闭 Swap 空间,-a 参数表示关闭 /etc/fstab 文件中配置的所有 Swap 空间。 使用场景:在高性能应用场景下,比如数据库服务器或高性能计算服务器,禁用 Swap 可以减少磁盘 I/O,提高系统性能。
388 3
|
10月前
|
缓存 Linux
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
756 2
|
监控 JavaScript Java
Node.js中内存泄漏的检测方法
检测内存泄漏需要综合运用多种方法,并结合实际的应用场景和代码特点进行分析。及时发现和解决内存泄漏问题,可以提高应用的稳定性和性能,避免潜在的风险和故障。同时,不断学习和掌握内存管理的知识,也是有效预防内存泄漏的重要途径。
723 62
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
1081 59