Visual Studio:触发AddressSanitizer异常后如何单次忽略并继续执行
解决方案
方法1:单次跳过当前异常(不修改代码,仅本次调试生效)
当ASAN异常弹窗弹出时按以下步骤操作即可跳过本次触发的异常:
- 点击弹窗上的「Break」按钮进入调试中断状态
- 按快捷键
Ctrl+Alt+I打开即时窗口(也可以通过菜单路径Debug -> Windows -> Immediate打开) - 在即时窗口输入命令
$exception = null后回车,清空当前异常上下文 - 右键点击代码编辑区左侧的黄色执行指针,选择「Set Next Statement」,将执行位置手动移动到
my_strlen函数的return n;行,跳过触发越界的最后一次循环访问 - 按F5继续运行即可,不会再重复触发当前位置的同个异常
方法2:仅禁用单个函数的ASAN检查(适合暂时不想修复问题,又不想每次调试都手动操作的场景)
只需要给你的my_strlen函数添加MSVC专用的ASAN忽略属性,就可以仅关闭该函数的地址消毒检查,其余代码的ASAN检查完全不受影响,修改后的代码如下:
__declspec(no_sanitize_address) size_t my_strlen(const char *my_string) { int n = 0; if (my_string == NULL) return 0; while (my_string[n] != 0) n++; return n; }
注意:两种方案都只是临时规避手段,你代码中的越界访问是真实存在的,后续建议排查问题根因修复,比如确认传入的字符串是否存在缺少'\0'终止符的情况。
内容的提问来源于stack exchange,提问作者Bùi Văn Thủ
相关产品推荐
相关产品推荐

