如何阻止Visual Studio按F11步入函数时打开memcpy汇编代码
问题场景
- 运行环境:Windows平台,使用clang编译代码,编译参数指定
-O0与-g,已在Visual Studio设置中启用「Just My Code(仅我的代码)」功能 - 异常表现:按F11步入函数时,只要函数按值传递结构体、或参数规模达到编译器自动插入
memcpy调用的阈值,Visual Studio就会直接展示memcpy的汇编代码,必须手动回退、定位到目标函数位置后按Ctrl+F10才能继续调试 - 触发时自动步入的汇编代码片段:
mov rax, rcx ; pre-set the return value lea r10, OFFSET __ImageBase ; pre-set the image base to be used in table based branching cmp r8, 15 ; dispatch to code handling block sizes of 16 bytes or more ja MoveAbove15 ; fall-thru to code handling length of 15 bytes or less
- 核心诉求:调试时可直接步入自定义目标函数,不要自动打开
memcpy.asm文件或展示对应汇编。
可行解决方案
- 编译参数层面规避
给clang追加编译参数-fno-builtin-memcpy,编译器将不会在结构体传参、参数拷贝的场景自动插入隐式memcpy调用,从根源避免该问题。该参数仅关闭编译器自动生成的隐式memcpy逻辑,代码中手动调用的memcpy不受影响。 - 调试器规则配置
通过Visual Studio的natstepfilter机制自定义单步跳过规则,操作如下:- 打开路径
%USERPROFILE%\Documents\Visual Studio <你的VS版本号>\Visualizers,比如VS2022对应路径为%USERPROFILE%\Documents\Visual Studio 2022\Visualizers,路径不存在则手动创建 - 在该路径下新建任意名称、后缀为
.natstepfilter的文件,写入以下内容:
- 打开路径
<?xml version="1.0" encoding="utf-8"?> <StepFilter xmlns="http://schemas.microsoft.com/vstudio/debugger/natstepfilter/2010"> <Function> <Name>memcpy</Name> <Action>NoStepInto</Action> </Function> <Function> <Name>__memcpy_*</Name> <Action>NoStepInto</Action> </Function> </StepFilter>
- 保存文件后重启Visual Studio,后续单步调试时调试器会自动跳过所有
memcpy相关实现,直接进入目标用户函数。
- 临时操作方案
若不想修改全局配置,可在函数调用行右键选择「步入特定」,在弹出的列表中直接选中你编写的目标函数即可跳过中间的memcpy调用,该方案无需改配置但每次调用都需要手动选择。
内容的提问来源于stack exchange,提问作者roCaP23
相关产品推荐
相关产品推荐

