【问题标题】:.NET Core 2.1 - My code does not appear in VS2017 stack trace.NET Core 2.1 - 我的代码没有出现在 VS2017 堆栈跟踪中
【发布时间】:2019-06-23 18:59:29
【问题描述】:

我正在使用依赖注入 (Microsoft.Extensions.DependencyInjection) 开发一个 .NET Core 2.1 控制台应用程序。代码如下所示:

class Program
{
    static async Task Main(string[] args)
    {
        //...

        var configuration = GetConfiguration();
        var serviceProvider = ConfigureServices(configuration);

        var importer = serviceProvider.GetRequiredService<DataImporter>();

        var result = await importer.ImportCentersAndStores(fileName);

        //...
    }

    private static IConfigurationRoot GetConfiguration()
    {
        return new ConfigurationBuilder()
            .AddJsonFile("appsettings.json")
            .Build();
    }

    private static ServiceProvider ConfigureServices(IConfigurationRoot configuration)
    {
        System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance);

        return new ServiceCollection()
            .AddLogging(builder =>
            {
                builder.AddConfiguration(configuration.GetSection("Logging"));
                builder.AddConsole();
            })
            .AddOptions()
            .AddAutoMapper()
            .AddDatabase(configuration.GetConnectionString("Blah"))
            .AddTransient<DataImporter>()
            .BuildServiceProvider();
    }
}

DataImporter 类和ImportCentersAndStores 方法并没有什么特别之处——它可以做各种事情,包括读取 Excel 文件和做一些日志记录。我不认为该代码的性质是相关的。

现在的问题是,每当在 DataImporter 类中引发异常时,堆栈跟踪都没有包含我的代码的帧:

调试显示如下:

无论我是否捕获抛出的异常,都会发生这种情况。上述异常发生在从ImportCentersAndStores 调用的DataImporter 中的一个方法中。所以那里应该有我的代码的两帧。

没有用于调试的上下文。我不能检查变量或任何东西。

我不知道System.Private.CoreLib 是什么,也不知道为什么它占用了大部分调用堆栈。我不知道这个问题是否真的与我使用 DI 有关。

只需我的代码没有区别。例外设置是默认设置。我看不到任何应该执行此操作的调试选项。

如果您想知道:我已将其包含在项目文件中以启用异步 Main 方法:

<LangVersion>7.1</LangVersion>

任何人都可以对此有所了解吗?

【问题讨论】:

  • 您可以使用CTRL+ALT+E 启用停止CLR 选项上的所有异常,这样您的代码炸毁VS 的地方就会停止代码。堆栈跟踪是废话,由异步引起......因为代码在另一个进程的另一个堆栈上运行......线程的常见问题。我认为VS2019应该带来更好的东西。你也可以尝试启用源链接..它会让你通过从微软下载源代码来进入那些dll的代码,但这仍然不能解决堆栈问题
  • async 堆栈跟踪的问题实际上是由于开发人员的误解。堆栈跟踪不会告诉您代码的来源——而且它从来没有。堆栈跟踪会告诉您代码返回到 的位置。碰巧这些对于同步代码是相同的,所以开发人员习惯了堆栈跟踪告诉他们他们是如何到达某个地方的(即因果链)。在异步世界中,因果链和堆栈跟踪是不同的东西;它们仅在同步世界中具有相同的值。

标签: c# .net-core visual-studio-2017 visual-studio-debugging


【解决方案1】:

在第二个屏幕截图中:异常帮助程序(弹出)-> 查看详细信息-> 堆栈跟踪。这将是在async sausage 启动之前引发异常时的正确堆栈跟踪。

所以 - 是的 - 这种行为是因为你的 async 东西。老实说,这让我很好奇,为什么你会在 console 应用程序中对async 做任何事情?

【讨论】:

  • 迈克,有很多用例: 1. 显而易见的一个:调用异步。 2. 构建一个事件监听器,它可以进行通信,例如通过 RabbitMq
  • wy 很简单:我正在注入和使用来自另一个程序集的东西(ConfigureServices 中的 AddDatabase 行)。那里有一些异步的东西,更容易从异步方法调用。
  • 但是你是说这都是因为异步?但这通常不会产生这些后果...?
  • 我会放弃异步,看看会发生什么。
  • @TorHaugen 是的,如果您必须使用已经存在的异步方法,这是有道理的。我认为如果你.RunSynchronously() 那个任务并且你有适当的符号它应该可以工作。但是关于 pumpkin 所说的,这也取决于停止异常对话框的设置。
猜你喜欢
  • 2014-03-07
  • 2011-08-07
  • 2011-03-31
  • 1970-01-01
  • 2017-12-15
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
相关资源
最近更新 更多