调试 ASP.Net 应用程序 - 跳过未命中的行和断点

Posted

技术标签:

【中文标题】调试 ASP.Net 应用程序 - 跳过未命中的行和断点【英文标题】:Debugging ASP.Net app - skipping lines and breakpoints not being hit 【发布时间】:2013-12-13 16:10:15 【问题描述】:

我在调试 ASP.Net 应用程序时遇到了一个非常奇怪的问题。它似乎发生在某个类中的所有函数上。我怀疑有几个问题都是相关的:

函数内部的断点被忽略,但如果我在调用该函数之前放置一个断点,然后 f11 介入,我可以正常调试该函数。 如果我附加调试器,然后添加一个断点,只要代码尚未执行,它就会添加它(尽管它会像上面那样被忽略)。一旦函数被调用,如果我尝试添加断点,Visual Studio 会给出错误“无法设置以下断点...公共语言运行时无法设置断点。

在调试时,某些行似乎完全被跳过了。例如考虑下面的函数:

public GetCareersParametersByCriteriaResponse GetCareersParametersByCriteria(GetCareersParametersByCriteriaRequest request)

    var response = new GetCareersParametersByCriteriaResponse 
       CareersParameters = new List<CareerParametersView>()
    ;
    var predicate = PredicateBuilder.True<CareerView>();

    if (!request.IncludeExcludeTop20Careers) 
       predicate = predicate.And(c => !c.ExcludeTop20);
    
    predicate = predicate.And(c =>
                              c.EducationMinimumLevel <= request.MinimumEducationLevel &&
                              c.EducationMaximumLevel >= request.MaximumEducationLevel);
    var careerIds = _careerLibrary.Careers.AsQueryable().Where(predicate).Select(c => c.CareerId).Distinct();
    foreach (var careerId in careerIds)  
        response.CareersParameters.Add(_careerLibrary.CareerParametersLookup[careerId]);
    

    response.IsSuccess = true;

    return response;

似乎跳过了分配给“谓词”的过程,并且值显示为空。然而,后面添加教育最小值/最大值的行仍然执行,但谓词的值仍然为空。从那里它直接跳过进入 foreach,而不分配给careerIds,并且似乎没有在迭代器上调用move next。结果,careerId 没有被赋值(所以有 0)并抛出错误,因为 0 不是有效的 Id。

注意:即使 0 是无效的 id 并导致抛出“给定的键不在字典中”异常,该函数仍会继续执行并返回。此时调试器完全消失(不会返回调用函数)并且一切似乎都被锁定(即页面永远不会加载等),直到我分离调试器并给出黄屏死机。

我已经尝试过的事情:

清洗液 重建解决方案 手动删除 bin 文件夹中的所有 dll 和 pdb 文件 重新启动视觉工作室 正在重新启动 确保禁用“优化代码” 确保多个线程不会同时调用该函数 修改代码文件并确保它接受更改以确保它运行的是最新版本。它是。 (还打开了 Debug > Windows > Modules 并检查了 pdb 上的时间戳 - 它是最新的) 删除位于 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files 的 DLL 的 IIS 副本 清除符号缓存 完全重新安装 VS2012 和所有插件(例如 resharper)

它似乎在安装 VS2012 更新 4 后立即开始发生,但我在网上找不到任何关于更新后此类问题的任何信息,并且重新安装 VS 没有帮助,所以这可能是巧合

更新:在调试时收到一条消息,表明源代码与 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files 处的 dll 不同。 .(即代码的 IIS 副本)我想我可能会做一些事情。然而,在删除那些之后它仍然没有任何区别,所以将它添加到我尝试过的事情列表中

更新 2: 完全重新安装了 VS2012,因为我怀疑更新可能有问题。然而仍然没有喜悦,同样奇怪的行为

更新 3: 经过进一步调查,我似乎对同一个项目/程序集中的所有类都遇到了同样奇怪的问题(解决方案中的其他项目都很好),这表明某处的项目级别设置。接受所有建议:-)

更新 4: 尝试在工具 > 选项 > 调试 > 符号中清除符号缓存

更新 5: 尝试从头开始重新安装 VS2012 - 仍然没有乐趣

【问题讨论】:

【参考方案1】:

最后完全重新格式化并重新安装是解决问题的唯一方法

【讨论】:

【参考方案2】:

尝试打开Modules 窗口(Debug-&gt;Windows-&gt;Modules) 并查看模块列表。您应该会看到与您的项目相关的 DLL 文件。现在,重要的是Symbol Status 列是否显示Symbols Loaded。如果不正确,请查看Path 列,检查是否正确。

【讨论】:

我已经检查了模块窗口 - 显示所有相关符号都已加载并且时间戳正确对应于上次构建时间

以上是关于调试 ASP.Net 应用程序 - 跳过未命中的行和断点的主要内容,如果未能解决你的问题,请参考以下文章

解决VS2013调试ASP.NET中无法调试的问题:当前不会命中断点。在 XXXX.dll 中找到了 XXX.cs 的副本,但是当前源代码与 XXXX.dll 中内置的版本不同。

远程调试asp.net

无法调试在 Docker 中运行的 ASP.NET 网站中的启动代码

pytest 不跳过未标记的测试

调试器未在 .NET 代码中命中断点

调试 ASP.NET MVC 应用程序时避免部署