AspNet Boilerplate调试模式启动输出Application is shutting down并闪退问题咨询
AspNet Boilerplate 调试模式启动自动退出问题排查方案
已知常见诱因
- 开发环境严格校验触发:ABP默认在调试对应的开发环境下,会开启更严格的依赖注入校验、配置合法性校验、模块依赖顺序校验,只要存在生命周期不匹配、必填配置缺失、模块依赖错误等问题,调试模式会直接触发终止逻辑,而非调试模式下部分校验等级降低,不会触发退出。
- 旧版本框架调试适配bug:部分低版本ABP框架存在调试器附加状态的误判逻辑,会错误判定应用启动失败,触发主动退出,可先尝试将所有ABP相关Nuget包升级到对应大版本的最新小版本验证。
- 调试进程权限差异:调试模式下通过Visual Studio、IIS Express启动的进程权限,和非调试模式单独运行时的权限存在差异,若ABP模块启动时需要读取特定路径文件、操作系统配置、绑定特殊端口,权限不足会直接触发启动失败退出。
- 模块异步初始化未处理异常:如果自定义ABP模块的
InitializeAsync/PostInitializeAsync方法内存在未捕获的异常,调试模式下默认会触发进程崩溃,而非调试模式下部分异常会被宿主吞掉,不会触发退出。
详细日志获取及排查方法
- 开启全量框架日志:在调试模式默认加载的
appsettings.Development.json配置文件中,调整日志级别到Trace级,输出全流程日志:
{ "Logging": { "LogLevel": { "Default": "Trace", "Abp": "Trace", "Microsoft": "Trace" } } }
日志会完整记录模块加载、依赖注入注册、配置绑定的所有步骤,可以定位到退出前最后执行的异常逻辑。
- 全局捕获启动异常:在
Program.cs文件的最顶部添加全局异常捕获代码,写入本地文件兜底排查:
// 捕获进程级未处理异常 AppDomain.CurrentDomain.UnhandledException += (sender, e) => { File.WriteAllText(@"C:\temp\abp-startup-failure.log", e.ExceptionObject.ToString()); }; // 捕获异步任务未观察异常 TaskScheduler.UnobservedTaskException += (sender, e) => { File.WriteAllText(@"C:\temp\abp-async-failure.log", e.Exception.ToString()); e.SetObserved(); };
可以捕获所有未被框架上层逻辑捕获的底层异常,包括程序集加载失败、依赖缺失、native库调用错误等问题。
- 启用程序集绑定日志:打开Visual Studio的「工具-选项-项目和解决方案-生成并运行」,将MSBuild项目生成输出详细程度调整为「诊断」,同时可开启系统融合日志(Fusion Log)查看所有程序集加载过程的成功、失败记录,定位依赖加载问题。
- 临时关闭开发环境校验验证:在
.UseAbp()配置中临时调整环境名,使用生产环境的校验逻辑运行调试模式:
.UseAbp(options => { options.DevelopmentEnvironmentName = Environments.Production; })
如果调整后不再自动退出,即可确定是开发环境的严格校验逻辑触发的问题,再针对性排查依赖注入配置、模块依赖顺序、必填配置项即可。
内容的提问来源于stack exchange,提问作者Roger Johansson
相关产品推荐
相关产品推荐

