【发布时间】: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