专栏首页独行猫a的沉淀积累总结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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android的Dialog弹出时隐藏导航栏效果,目前认为的最优解

    原本Android的ProgressDialog用法很简单,两三行代码就搞定了。但是,但是,但是,用在无人值守的自助终端上,总是把之前隐藏掉的导航栏和状态栏显示...

    特立独行的猫a
  • 对“产品“和“运营“的理解

    如果就这么的把生产的物品理解为产品,或者一套套的软件理解为产品,那么侧重点自然就会放在设备的生产和软件的一套套兜售为盈利的方向,而产品不应当但指生产的物品或软件...

    特立独行的猫a
  • 听 “新技术、新视野、新时代”讲座有感

    想和做是两码事,但想是做之母。敢于天马行空的想象不是坏事。敢于想才是迈开行动的第一步。

    特立独行的猫a
  • NIO DirectByteBuffer 内存泄露的测试

          写NIO程序经常使用ByteBuffer来读取或者写入数据,那么使用ByteBuffer.allocate(capability)还是使用ByteB...

    小程故事多
  • LINUX内存高,触发OOM-KILLER问题解决

    Linux alarm 2.6.9-67.ELsmp #1 SMP Wed Nov 7 13:58:04 EST 2007 i686 i686 i386

    一见
  • MMU那些事儿

    [导读] 本文从内存管理的发展历程角度层层递进,介绍MMU的诞生背景,工作机制。而忽略了具体处理器的具体实现细节,将MMU的工作原理从概念上比较清晰的梳理了一遍...

    逸珺
  • win32应用程序性能测试-内存篇

    本文主要讲述windows平台下应用程序性能测试的内存相关的知识,通过本文了解内存基本原理和分析内存占用问题。 一、内存是什么? 1内存分为物理内存和虚拟内存 ...

    腾讯移动品质中心TMQ
  • Hadoop学习17--yarn配置篇-内存管理

    这篇文章来自于:董的博客,记录备查 内存管理,主要是管理nodemanager上的物理内存和虚拟内存。 YARN允许用户配置每个节点上可用的物理内存资源,注意,...

    小端
  • 虚拟内存详解

    究其原因,监控系统计算的可用内存算法有偏差,他只关注了计算机的“实际”内存,忽略了计算机的虚拟内存。

    bisal
  • js中的数据_变量_内存

    * 产生和死亡: 内存条(集成电路板)==>通电==>产生一定容量的存储空间==>存储各种数据==>断电==>内存全部消失

    李才哥

扫码关注云+社区

领取腾讯云代金券