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

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

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

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

vs2019 C++自带了内存问题检测工具:AddressSanitizer(ASan)_第1张图片

2、项目的属性里, 开启“启用地址擦除系统”:
vs2019 C++自带了内存问题检测工具:AddressSanitizer(ASan)_第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

你可能感兴趣的:(C++,内存检测工具,服务器,C++,内存检测工具)