Visual Studio属性setter内代码行断点无法命中求助
问题复现
在如下属性的setter中,尝试给Name = _selectedViewModel.Name行设置断点时失败:
var _selectedViewModel; public MyViewModel SelectedViewModel { get { return _selectedViewModel; } set { _selectedViewModel= value; Name = _selectedViewModel.Name; } }
Visual Studio抛出错误提示:
当前不会命中断点。该行没有关联的可执行代码。可能的原因包括:条件编译或编译器优化,或者当前调试器代码类型不支持该行的目标架构。
同属性的getter断点设置、命中均正常,已尝试清理重建解决方案、确认配置为Debug | Any CPU、开启Suppress JIT on module load、重启设备均无法解决。
排查&解决步骤
按优先级依次尝试以下操作:
关闭编译优化,确认调试符号生成配置
右键目标项目选择「属性」-「生成」页,确认当前选中配置为Debug、目标平台匹配运行环境,取消勾选「优化代码」选项;再点击页面下方「高级」按钮,将「调试信息」设置为可移植(Portable)或Full,禁止选择None。保存配置后,手动删除项目下所有bin、obj文件夹内容,再重新生成解决方案。
注:Debug配置默认关闭优化,但部分项目迁移、配置共享场景下会意外开启该选项,开启后编译器会合并无分支的简单赋值逻辑,导致代码行无对应独立IL指令,无法绑定断点。排查IL织入/源生成器对属性的改写
如果项目中引用了PropertyChanged.Fody、MVVM Toolkit源生成器、AOP织入类工具,这类工具会在编译阶段直接修改属性的IL逻辑,手写的setter代码行可能被合并、重排甚至移除,自然无法绑定断点。
可以先临时禁用这类织入组件重新生成验证,如果确认是织入导致,可选择以下任意方案:- 给setter的首行
_selectedViewModel = value;打断点,单步执行即可走到后续属性赋值逻辑 - 在需要断点的位置前临时插入一行无副作用的调试代码,比如
_ = 0;,重新生成后即可给新行绑定断点 - 直接插入硬编码断点
System.Diagnostics.Debugger.Break();,运行到该行会自动触发调试中断
- 给setter的首行
验证调试符号加载正确性
启动调试后,依次打开菜单栏「调试」-「窗口」-「模块」,找到目标项目对应的程序集,查看「符号状态」列:如果显示符号未加载、或加载路径不是最新生成的bin目录下的pdb,右键该程序集选择「手动加载符号」,选中最新生成的pdb文件即可。排查partial类/继承类的属性遮蔽
检查当前类是否为partial类,是否在其他代码文件中定义了同名SelectedViewModel属性;或者当前类是否通过new关键字遮蔽了父类的同名属性,当前编辑的属性代码根本没有被编译进最终运行的程序集。
内容的提问来源于stack exchange,提问作者Flack

