当调试器附加到.NET进程时,它(通常)在抛出未处理的异常时停止.
但是,当您使用某种async方法时,这似乎不起作用.
我之前尝试的方案列在以下代码中:
class Program
{
static void Main()
{
// Debugger stopps correctly
Task.Run(() => SyncOp());
// Debugger doesn't stop
Task.Run(async () => SyncOp());
// Debugger doesn't stop
Task.Run((Func<Task>)AsyncTaskOp);
// Debugger stops on "Wait()" with "AggregateException"
Task.Run(() => AsyncTaskOp().Wait());
// Throws "Exceptions was unhandled by user code" on "await"
Task.Run(() => AsyncVoidOp());
Thread.Sleep(2000);
}
static void SyncOp()
{
throw new Exception("Exception in sync method");
}
async static void AsyncVoidOp()
{
await AsyncTaskOp();
}
async static Task AsyncTaskOp() …Run Code Online (Sandbox Code Playgroud) 很清楚为什么堆栈跟踪会受到微软新编程范式的影响.我们现在有一个语义堆栈和几个物理堆栈(我选择的单词).
我看到的是异常的StackTrace属性(在调试器中)是物理的属性,连接起来:
private async Task CheckFooAndBar()
{
var log = LogManager.GetLogger("Test");
log.Info("CheckFooAndBar");
try
{
await Foo();
}
catch (Exception ex)
{
log.Info("StackTrace of last exception: " + ex.StackTrace);
}
Console.ReadKey();
}
private async Task Foo()
{
await Task.Factory.StartNew(() => Thread.Sleep(1000));
await Bar();
await Task.Factory.StartNew(() => Thread.Sleep(1000));
}
private async Task Bar()
{
await Task.Factory.StartNew(() => Thread.Sleep(1000));
throw new Exception();
await Task.Factory.StartNew(() => Thread.Sleep(1000));
}
Run Code Online (Sandbox Code Playgroud)
这给出了:
StackTrace of last exception: at NLogAsyncExceptionTestCase.Program.<Bar>d__d.MoveNext() in c:\Users\Jens\Documents\Visual Studio 2012\Projects\NLogAsyncExceptionTestCase\NLogAsyncExceptionTestCase.Console\Program.cs:line 53
--- End …Run Code Online (Sandbox Code Playgroud) 如何在visual studio 2012的调试输出窗口中禁用消息?
线程''(0x2360)已退出,代码为0(0x0)
由于这些消息的数量如此之高,他们会打扰我并隐藏我使用的自定义调试信息Debug.Write.我应该使用红色突出显示我的自定义调试信息吗?
我正在使用ASP.NET MVC项目,该项目在连接到IIS进程(w3wp.exe)时似乎遇到了一些问题.我在我自己的本地计算机上运行解决方案和IIS 8.5,所以我不认为这与我们的网络有任何关系.对我来说很奇怪的是,我能够在我本地调试的任何其他解决方案上达到断点.
我所拥有的问题是,断点转向红色,空心圆圈,永远不会被击中.通常,对此的修复是对解决方案的清理/重建,但这没有奏效.我已经确认通过向页面添加"throw new Exception"并确保它显示异常来更新代码.同样,这个问题只发生在这个问题上.我运行调试器的任何其他解决方案都可以正常工作.我也尝试重新启动应用程序池,网站,IIS以及我的计算机.
我读过的一些文章提到反病毒程序可以阻止远程调试器访问进程.但是,整个设置包含在我的本地计算机上,因此听起来不是问题.它确实让我有点担心,因为我们最近雇用了一个新的IT人员,他们正在对每个人的机器做出很多改变.
另外一点是添加这个Web应用程序的独特之处是IIS中的绑定.绑定是"*",以便利用与子域相关的一些自定义功能.
与此同时,我将继续寻找解决方案,但如果有人有任何想法可能导致这个解决方案无法正确调试我真的很感激.
编辑:找到建议删除ASP.NET临时文件的解决方案.没运气.
iis asp.net-mvc visual-studio visual-studio-debugging visual-studio-2013
使用VS2015快照和分析工具后,我似乎无法让诊断工具再次工作.每个项目,甚至是新项目都只说以下内容
"诊断工具"窗口不支持当前的调试配置.
尝试创建新的和不同类型的项目,以管理员身份运行,删除程序数据,应用程序数据,修复和从卸载重新安装.
有人经历过这个吗?很遗憾,因为他们在这个版本中对这个工具进行了大量改进.
谢谢
c# debugging visual-studio visual-studio-debugging visual-studio-2015
在我的Visual Studio 2013 RC项目中,我得到了这个错误信息:
" 类型'System.Net.Http.Formatting.MediaTypeFormatter'是在未引用的程序集中定义的.您必须添加对程序集'System.Net.Http.Formatting,Version = 4.0.0.0,Culture = neutral, PublicKeyToken = 31bf3856ad364e35' "
...在"var response = "Controller中的代码行上:
public HttpResponseMessage PostDelivery(Delivery delivery)
{
delivery = repository.Add(delivery);
var response = Request.CreateResponse<Delivery>(HttpStatusCode.Created, delivery);
string uri = Url.Link("DefaultApi", new { id = delivery.Id });
response.Headers.Location = new Uri(uri);
return response;
}
Run Code Online (Sandbox Code Playgroud)
在我的硬盘中搜索所需的程序集("System.Net.Http.Formatting"),它向我显示了它存在的几个位置,但它们都在现有项目中,如下所示:

当然还有另一个位置,可以从中引用System.Net.Http.Formatting.dll!但是哪里?
试着按照这里的线索:http://www.nuget.org/packages/System.Net.Http.Formatting
IOW,选择工具>库包管理器>包管理器控制台,然后输入:
Install-Package System.Net.Http.Formatting -Version 4.0.20710
Run Code Online (Sandbox Code Playgroud)
......我看到潘普洛纳(不是饮料)的红牛在我身上肆虐:

我从这里添加了System.Net.Http.Formatting.dll:
C:\Users\clay\My Documents\Visual Studio 2013\Projects\MvcApplication1\MvcApplication1\bin
Run Code Online (Sandbox Code Playgroud)
......它现在编译并运行并按预期工作,但这显然是"不是首选的方法"
system.net .net-assembly visual-studio-debugging mediatypeformatter visual-studio-2013
我不确定我做了什么,但突然之间,我的Visual Studio 2012将不会调试任何测试.
如果我从Test Explorer中选择一个测试并告诉它运行,它只是在Test Output窗口输出:
> ------ Discover test started ------
> ========== Discover test finished: 29 found (0:00:01.3371755) ==========
> ------ Run test started ------ Process with an Id of -1 is not running.
> ========== Run test finished: 0 run (0:00:01.4711861) ==========
Run Code Online (Sandbox Code Playgroud)
这是什么意思?!执行此操作几次后,错误更改为:
The Operation was Cancelled
Run Code Online (Sandbox Code Playgroud)
我当然没有这样做.
它是在列表中的每个测试中执行此操作.
但是,我可以运行测试没有问题,他们通过...但我无法调试测试.
我可以做些什么?我没有主动进入任何设置并改变任何东西,也许是某个地方的流浪点击,但在哪里?
visual-studio visual-studio-debugging vs-unit-testing-framework visual-studio-2012 visual-studio-2017
突然之间,我遇到了一个无法通过Visual Studio中的调试进入任何代码的问题.步骤结束工作正常,但它拒绝进入(F11)我的任何代码.这在以前工作,现在突然之间没有.
我已经尝试了下面的一些事情,但我仍然没有成功:
删除解决方案中每个项目中的所有bin文件,清理解决方案,重新构建解决方案.
在解决方案中单独构建项目
重启机器
它是一个ASP.NET C#应用程序,在本地使用WCF服务.它处于调试模式.我在使用该服务的页面上设置了断点.断点命中,但它不会进入服务代码.
ASP.NET站点和服务代码都在同一个解决方案中.这突然不起作用,之前确实有效.
我该如何解决这个问题?
在服务项目中添加断点我收到警告:
断点当前不会被击中.没有为此文档加载任何符号.
我删除了所有项目的所有bin文件夹,并逐个重新构建它们.它们都成功了,但我仍然认为符号不会加载到我在解决方案中的任何项目中的任何断点上,而不是断点工作的ASP.NET项目.我之前能够调试步骤进入所有项目,这是一个突然的事情.
输出窗口中的信息..
'WebDev.WebServer40.EXE' (Managed (v4.0.30319)): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\SMDiagnostics\v4.0_4.0.0.0__b77a5c561934e089\SMDiagnostics.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'WebDev.WebServer40.EXE' (Managed (v4.0.30319)): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Runtime.DurableInstancing\v4.0_4.0.0.0__31bf3856ad364e35\System.Runtime.DurableInstancing.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' is enabled.
'WebDev.WebServer40.EXE' (Managed (v4.0.30319)): Loaded 'C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Xaml.Hosting\v4.0_4.0.0.0__31bf3856ad364e35\System.Xaml.Hosting.dll', Skipped loading symbols. Module is optimized and the debugger option 'Just My Code' …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的课程:
public class MyService
{
private MyService(){}
public static string GetStuff()
{
var stuffDid = new MyService();
return stuffDid.DoStuff();
}
private string DoStuff()
{
//do stuff
}
//other private helpers
}
Run Code Online (Sandbox Code Playgroud)
显然我离开了很多,但那是一般的外壳.
现在,我有一个单元测试:
[Test]
public void MyTest()
{
var results = MyService.GetStuff();
}
Run Code Online (Sandbox Code Playgroud)
我在单元测试中设置了断点,我可以看到它results有数据.但是,我完全设置了断点MyService,除非我把它们放在花括号上,否则什么都不会被击中.哪些我无法理解,因为results有数据,我的return陈述MyService应该被击中,对吧?
我错过了什么吗?我完全忘记了最基本的规则吗?怎么没有MyService被击中?如果我手动插入它F11,它只是跳来跳去,甚至没有像我期望的那样通过每一行.此外,当我通过手动步进时,我倾向于在我应该最初击中它之后击中某些代码.并且任何switch语句似乎默认为第一个选项,即使切换的值应该明确输入不同的case.
我甚至试过制作MyService构造函数public并取消所有static方法,但它仍然无法工作.
编辑:我的测试和'核心'代码在同一个解决方案中,但不同的项目(Test和Core分别).其他测试没有遇到突破点的问题Core,只有特定测试(测试的唯一测试)MyService.
编辑2: …
我有一个使用Visual Studio 2013创建的ASP.NET Web应用程序.我正在尝试在CSHTML文件中调试JavaScript.但是,每当我启动网页时,任何断点都会变成一个红色圆圈箭头,并指出"断点当前不会被命中.调试器的目标代码类型的可执行代码与此行没有关联.可能的原因包括:条件编译,目前的调试器代码类型不支持编译器优化或该行的目标体系结构."
最近,该项目被转换为支持MVC和RAZR,我都不知道,这正是这个问题的开始.但是,搜索那些已经产生的结果无法解决我的问题.
Web.config文件:
<compilation debug="true"...>
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用Firebug或其他一些浏览器工具调试JavaScript,但我更愿意坚持使用Visual Studio的调试,因为这是我习惯的.
javascript asp.net-mvc visual-studio-debugging visual-studio-2013
c# ×4
debugging ×4
asp.net-mvc ×2
async-await ×2
.net ×1
exception ×1
iis ×1
javascript ×1
logging ×1
stack-trace ×1
system.net ×1