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

您所在的位置:网站首页 内存的测试工具有哪些 vs2019 C++自带了内存问题检测工具:AddressSanitizer(ASan)

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

2024-01-02 20:41| 来源: 网络整理| 查看: 265

之前做服务器时,一般是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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3