Every 3rd or 4th time I attempt to debug my application (.NET 8, WPF, C#) the debug session freezes at startup. I see my splash screen and nothing further happens. The code is locked in a call to log4Net's LogManager.GetLogger.
Even Debug >> Break does not work at this point. (I get an error message from Visual Studio that cannot pause the application with "This usually indicates the application is in a broken state").
If I stop the app and debug it again and it goes just fine, for maybe 2 or 3 more times. Then this happens again. This only happens when debugging. Never in a release build. But it's so frequent it's really annoying.
I turned on internal log4Net debugging. When it hangs, I get these lines at the very end of the internal logging statements and then no further output
log4net: Setting Property [Layout] to object [log4net.Layout.PatternLayout]
log4net: Searched for existing files in [C:\Users\jmole\AppData\Local\Temp]
log4net: curSizeRollBackups starts at [0]
log4net: Opening file for writing [C:\Users\jmole\AppData\Local\Temp\Mobile.log] append [True]
But when it does not hang, this is what I get (first line is the same as above but the subsequent lines are different)
log4net: Setting Property [Layout] to object [log4net.Layout.PatternLayout]
log4net: Created Appender [debug]
log4net: Adding appender named [debug] to logger [root].
log4net: Hierarchy Threshold []
After that, the GetLogger call returns and my application proceeds normally.
Here is my code that retrieves the logger
private ILog? LoggerImpl
{
get
{
lock(_lock)
{
if (_logger != null)
return _logger;
if (_failedToGetLogger)
return null;
enter code here
Debug.WriteLine($"Logger getting first time for app type {_appType.Name}");
try
{
_logger = LogManager.GetLogger(_appType);
SetLogging(true, false); // Start off with logging enabled (but don't log this)
}
catch (Exception e)
{
_failedToGetLogger = true;
_logger = null;
}
return _logger;
}
}
}
Here is my log4Net config file
<log4net>
<root>
<level value="ALL" />
<!-- <appender-ref ref="console" /> -->
<appender-ref ref="file" />
<appender-ref ref="debug"/>
</root>
<!--
-->
<appender name="debug" type="log4net.Appender.DebugAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{HH:mm:ss.fff} [%3thread] %5level - %message%newline" />
</layout>
</appender>
<appender name="file" type="log4net.Appender.RollingFileAppender">
<file type="log4net.Util.PatternString" value="%env{TEMP}/Mobile.log" />
<appendToFile value="true" />
<rollingStyle value="Size" />
<maxSizeRollBackups value="5" />
<maximumFileSize value="25MB" />
<staticLogFileName value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date{HH:mm:ss.fff} [%3thread] %5level - %message%newline" />
</layout>
</appender>
</log4net>
Here is the complete set of lines dumped out by log4net when it hangs. The first line is mine, just before the call to GetLogger all the rest are from log4net
Logger getting first time for app type App
log4net: log4net assembly [log4net, Version=2.0.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a]. Loaded from [C:\Users\jmole\source\repos\Main\Mobile\x64\Debug\net8.0-windows\log4net.dll]. (.NET Runtime [8.0.1] on Microsoft Windows NT 10.0.22631.0)
log4net: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository for assembly [Mobile, Version=3.7.0.0, Culture=neutral, PublicKeyToken=null]
log4net: Assembly [Mobile, Version=3.7.0.0, Culture=neutral, PublicKeyToken=null] Loaded From [C:\Users\jmole\source\repos\Main\Mobile\x64\Debug\net8.0-windows\Mobile.dll]
log4net: Assembly [Mobile, Version=3.7.0.0, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified.
log4net: Assembly [Mobile, Version=3.7.0.0, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]
log4net: configuring repository [log4net-default-repository] using file [C:\Users\jmole\source\repos\Main\Mobile\x64\Debug\net8.0-windows\log4net_mobile.config]
log4net: configuring repository [log4net-default-repository] using stream
log4net: loading XML configuration
log4net: Configuring Repository [log4net-default-repository]
log4net: Configuration update mode [Merge].
log4net: Logger [root] Level string is [ALL].
log4net: Logger [root] level set to [name="ALL",value=-2147483648].
log4net: Loading Appender [file] type: [log4net.Appender.RollingFileAppender]
log4net: Parameter [file] specified subtype [log4net.Util.PatternString]
log4net: Converter [env] Option [TEMP] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [/Mobile.log] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Performing additional conversion of value from [PatternString] to [String]
log4net: Setting Property [File] to String value [C:\Users\jmole\AppData\Local\Temp/Mobile.log]
log4net: Setting Property [AppendToFile] to Boolean value [True]
log4net: Setting Property [RollingStyle] to RollingMode value [Size]
log4net: Setting Property [MaxSizeRollBackups] to Int32 value [5]
log4net: Setting Property [MaximumFileSize] to String value [25MB]
log4net: Setting Property [StaticLogFileName] to Boolean value [True]
log4net: Setting Property [LockingModel] to object [log4net.Appender.FileAppender+MinimalLock]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [ConversionPattern] to String value [%date{HH:mm:ss.fff} [%3thread] %5level - %message%newline]
log4net: Converter [date] Option [HH:mm:ss.fff] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [thread] Option [] Format [min=3,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [] ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [level] Option [] Format [min=5,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ - ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [Layout] to object [log4net.Layout.PatternLayout]
log4net: Searched for existing files in [C:\Users\jmole\AppData\Local\Temp]
log4net: curSizeRollBackups starts at [0]
log4net: Opening file for writing [C:\Users\jmole\AppData\Local\Temp\Mobile.log] append [True]
And here is the complete set of log lines of one that does not hang.
Logger getting first time for app type App
log4net: log4net assembly [log4net, Version=2.0.15.0, Culture=neutral, PublicKeyToken=669e0ddf0bb1aa2a]. Loaded from [C:\Users\jmole\source\repos\Main\Mobile\x64\Debug\net8.0-windows\log4net.dll]. (.NET Runtime [8.0.1] on Microsoft Windows NT 10.0.22631.0)
log4net: defaultRepositoryType [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository for assembly [Mobile, Version=3.7.0.0, Culture=neutral, PublicKeyToken=null]
log4net: Assembly [Mobile, Version=3.7.0.0, Culture=neutral, PublicKeyToken=null] Loaded From [C:\Users\jmole\source\repos\Main\Mobile\x64\Debug\net8.0-windows\Mobile.dll]
log4net: Assembly [Mobile, Version=3.7.0.0, Culture=neutral, PublicKeyToken=null] does not have a RepositoryAttribute specified.
log4net: Assembly [Mobile, Version=3.7.0.0, Culture=neutral, PublicKeyToken=null] using repository [log4net-default-repository] and repository type [log4net.Repository.Hierarchy.Hierarchy]
log4net: Creating repository [log4net-default-repository] using type [log4net.Repository.Hierarchy.Hierarchy]
log4net: configuring repository [log4net-default-repository] using file [C:\Users\jmole\source\repos\Main\Mobile\x64\Debug\net8.0-windows\log4net_mobile.config]
log4net: configuring repository [log4net-default-repository] using stream
log4net: loading XML configuration
log4net: Configuring Repository [log4net-default-repository]
log4net: Configuration update mode [Merge].
log4net: Logger [root] Level string is [ALL].
log4net: Logger [root] level set to [name="ALL",value=-2147483648].
log4net: Loading Appender [file] type: [log4net.Appender.RollingFileAppender]
log4net: Parameter [file] specified subtype [log4net.Util.PatternString]
log4net: Converter [env] Option [TEMP] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [/Mobile.log] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Performing additional conversion of value from [PatternString] to [String]
log4net: Setting Property [File] to String value [C:\Users\jmole\AppData\Local\Temp/Mobile.log]
log4net: Setting Property [AppendToFile] to Boolean value [True]
log4net: Setting Property [RollingStyle] to RollingMode value [Size]
log4net: Setting Property [MaxSizeRollBackups] to Int32 value [5]
log4net: Setting Property [MaximumFileSize] to String value [25MB]
log4net: Setting Property [StaticLogFileName] to Boolean value [True]
log4net: Setting Property [LockingModel] to object [log4net.Appender.FileAppender+MinimalLock]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [ConversionPattern] to String value [%date{HH:mm:ss.fff} [%3thread] %5level - %message%newline]
log4net: Converter [date] Option [HH:mm:ss.fff] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [thread] Option [] Format [min=3,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [] ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [level] Option [] Format [min=5,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ - ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [Layout] to object [log4net.Layout.PatternLayout]
log4net: Searched for existing files in [C:\Users\jmole\AppData\Local\Temp]
log4net: curSizeRollBackups starts at [0]
log4net: Opening file for writing [C:\Users\jmole\AppData\Local\Temp\Mobile.log] append [True]
log4net: Created Appender [file]
log4net: Adding appender named [file] to logger [root].
log4net: Loading Appender [debug] type: [log4net.Appender.DebugAppender]
log4net: Converter [logger] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [ConversionPattern] to String value [%date{HH:mm:ss.fff} [%3thread] %5level - %message%newline]
log4net: Converter [date] Option [HH:mm:ss.fff] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [thread] Option [] Format [min=3,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [] ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [level] Option [] Format [min=5,max=2147483647,leftAlign=False]
log4net: Converter [literal] Option [ - ] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [message] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Converter [newline] Option [] Format [min=-1,max=2147483647,leftAlign=False]
log4net: Setting Property [Layout] to object [log4net.Layout.PatternLayout]
log4net: Created Appender [debug]
log4net: Adding appender named [debug] to logger [root].
log4net: Hierarchy Threshold []