如何在C#单元测试中单步进入函数调试代码?
问题场景
为现有解决方案新增基于.NET Framework 4.5的C#单元测试时,出现调试异常:测试逻辑可正常执行,但无法单步进入同解决方案其他项目的方法内部,执行到CalculateChartLines方法调用行时调试器直接单步跳过。
已知信息:
- 待调试代码属于同解决方案下的独立项目,单元测试项目已添加对应项目引用,而非直接引用GAC中的程序集
- 待调试主项目的程序集已注册到GAC
- 同解决方案下此前编写的单元测试均可正常单步调试
测试方法代码
[TestMethod] public void CalculateChartlines_HasValidCL() { // 初始化lvi、startDate、endDate参数 ChartLines pchart = new ChartLines(); CenterlineDateRange cdr = new CenterlineDateRange(0, true, startDate, endDate, 12); var valuesOut = pchart.CalculateChartLines(ChartType.P_Chart, lvi, cdr); // 调试到此处直接跳过,无法进入方法内部 ... }
被调用类代码
public class ChartLines : ILNCharts { public ChartLines() { } public List<ValuesOut> CalculateChartLines(ChartType chartType, List<ValuesIn> lvi, CenterlineDateRange cldr) { return GetCalculateChartLines(chartType, lvi, cldr); } // 其余方法省略 } public interface ILNCharts { List<ValuesOut> CalculateChartLines(ChartType chartType, List<ValuesIn> lvi, CenterlineDateRange cldr); // 其余接口方法省略 }
排查解决步骤
按优先级从高到低操作即可:
- 确认调试配置:检查解决方案及所有关联项目的激活配置为
Debug而非Release,进入项目属性-生成页签,确认未勾选优化代码选项,Release模式的编译优化会直接导致断点不命中、单步跳过方法。 - 解决GAC程序集优先级问题:这是该场景下最高发的原因。即使添加了项目引用,CLR加载程序集时会优先匹配GAC中同标识的程序集,如果GAC中的程序集版本和当前解决方案编译输出的版本一致,运行时会直接加载GAC内无对应调试符号的版本,导致无法单步。处理方式有两种:一是临时卸载GAC中注册的对应程序集,调试完成后再重新注册;二是修改被引用项目的程序集版本号,让运行时识别到版本差异,加载解决方案输出目录下带pdb调试符号的本地程序集。
- 验证调试符号加载状态:调试运行状态下打开菜单栏调试-窗口-模块,在列表中找到被调用项目对应的dll文件,查看符号状态列,如果显示“符号未加载”,右键选择加载符号,手动指向该项目bin目录下生成的同名pdb文件即可。
- 调整调试器设置:打开菜单栏工具-选项-调试-常规,取消勾选启用仅我的代码选项,避免调试器将外部程序集判定为非用户代码自动跳过。
- 清理编译缓存:关闭Visual Studio后删除所有项目下的bin、obj文件夹,重新打开解决方案后执行“全部重新生成”,清除旧版本dll、pdb不匹配导致的调试异常。
内容的提问来源于stack exchange,提问作者Kelly
相关产品推荐
相关产品推荐

