vs2019 C++自带了内存问题检测工具:AddressSanitizer(ASan)

之前做服务器时,一般是linux下的C++, 
C++容易出很多内存问题:内存泄漏、内存越界、野指针 空指针之类的问题。 
linux下 运行时检测工具,有 valgrind,正常编译debug版,然后附加运行就行了, 就是大程序会有比较卡; 也有 AddressSanitizer(ASan) , 编译后直接运行检测。

最近接触一个windows的C++项目, 之前一直苦于没好用的内存检测工具。 最近再查资料发现,VS2019 新的版本,已经带有 AddressSanitizer(ASan) , 虽然还是在测试阶段。
尝试用了一下,还可以。

1、需要安装一下这个工具:

2、项目的属性里, 开启“启用地址擦除系统”:

如果编译报错,根据错误信息调整一下。(比如之前 Debug 不支持 /ZI ,  不过我升级V16.11.xx之后 就没提醒,但是 遇到内存越界不会报错了,所以一定要改成/Zi

3、然后运行exe就行了,如果代码有内存问题,会报错。   不过直接运行exe,若检测到读越界、写越界, 程序都会闪退,常看不到信息。 
处理方案:
一个就是 vs直接调试运行,
一个就是 环境变量里加上 ASAN_OPTIONS  halt_on_error=0:log_path=asan.log   
或者 运行的命令行里执行:set ASAN_OPTIONS=halt_on_error=0:log_path=asan.log

出现问题时,会在 当前exe目录下生成 asan.log.xxxx  (文件名自己定的,后面的数字应该是进程号)



遇到的问题:
(1) 这版项目,Debug 版本引用的几个自己编的.DLL 会出Assert  
Debug Assertion Failed: _CrtIsValidHeapPointer(block)
自己的解决办法是,把对应dll 也开启 asan 重新编一下。。。
(2) halt_on_error=0 参数好像作用不大, 程序还是一检测就闪退,我再研究研究。

其他可以找网上的资料, 看看报错了之后如何定位问题
VS2019中使用AddressSanitizer检测内存问题 - 简书

比如它能比较好的定位到 野指针问题。 
某某行代码 访问xxx内存 有问题
这个内存在哪行代码释放掉了
这个内存是在那行代码分配的之类的。

再好好看看自己的代码,大部分能定位出问题来。   (不过还是有些报错很难定位 - -!)
 

官方一些资料:
 AddressSanitizer 已知问题 | Microsoft Docs

  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值