不同编译模式下的奇怪bug
Posted
技术标签:
【中文标题】不同编译模式下的奇怪bug【英文标题】:Strange bug in different compilation mode 【发布时间】:2014-04-14 19:52:10 【问题描述】:我遇到了一个非常奇怪的错误,它仅在 Release 模式下编译时出现,而在 Debug 模式下代码运行完美。此外,该错误仅在一台机器上遇到(用户报告了这一点)。
这是堆栈跟踪:
System.IO.FileNotFoundException:找不到文件“C:\Users...\FileName.txt”。 文件名:'C:\Users...\FileName.txt' 在 System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) 在 System.IO.FileInfo.get_Length() 在 PatcherNET4.FileHandler.LocalFile.get_Size() 在 PatcherNET4.FileHandler.CachedFile.IsLocalValid(LocalFile 文件) 在 PatcherNET4.FileHandler.FileManager.c__DisplayClassd.b__9(CachedFile 文件) 在 System.Linq.Enumerable.FirstOrDefault[TSource](IEnumerable
1 source, Func
2 谓词) 在 PatcherNET4.FileHandler.FileManager.RemoveLocalFiles() 在 PatcherNET4.FileHandler.FileManager.DownloadMissingFiles() 在 System.Threading.ThreadHelper.ThreadStart_Context(对象状态) 在 System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback 回调, 对象状态, Boolean preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 在 System.Threading.ThreadHelper.ThreadStart()
这是代码:
// CachedFile
...
public bool IsLocalValid(LocalFile file)
var checkName = file.Name == Name;
var checkSize = file.Size == Size;
var checkLastWrite = file.LastWriteTime == LastWriteTime;
return checkName && checkSize && checkLastWrite;
...
//LocalFile
...
public uint Size
get
_info.Refresh();
return (uint)_info.Length;
...
这怎么可能?我可以向您保证,发布模式和调试模式之间感兴趣的代码片段没有区别。我真的不知道该怎么办,这可能是我见过的最奇怪的错误。
【问题讨论】:
那台机器上是否存在C:\Users...\FileName.txt
?
路径是相对的吗?在 debug/release 中运行时,程序的运行目录会有所不同。
是的,它存在;此外,该错误发生在两次不同运行中的两个不同文件中
仅依赖于编译模式的错误闻起来像运行条件。
@tnw:是的,它是相对的(感谢这一点,我明天试试)。但是这个bug怎么可能只在一台机器上遇到,而200多人都在使用呢?比如SJuan?
【参考方案1】:
将 FileName.txt 放入 Unable to find file 'C:\Users...\(here) directory
【讨论】:
@LightStyle 检查文件名哥 System.IO.FileNotFoundException 已经做到了。我没那么傻,别担心。该文件在那里,但程序无法识别它。我还认为这可能是路径的问题(其中包含一个空格),我让用户更改它并且它也不起作用。 嗯,这是可能的。但是您如何解释这个“愚蠢的程序”可以在 200 多台机器上正常运行而没有错误仅在发布模式下在单台机器上运行? 有可能。但是我还不能解释自己在调试和发布模式下同一个程序有什么不同。 @LightStyle 如果您在调试模式下使用 当前目录...您应该在发布模式下使用 absolute 位置...好的跨度> 【参考方案2】:我要尝试的第一件事是验证文件在运行时是否存在并从那里开始。
if (!File.Exists(fileName))
// do something
如果文件不存在(当您说它丢失时,我相信您)然后考虑替代方案。文件已经被删除了吗?我注意到堆栈跟踪中有 RemoveLocalFiles,所以它可能已经运行了。也许用户按了两次按钮?比赛条件。单独的线程?用户在两台机器上登录并具有漫游配置文件。或者类似的东西。
无论它是否是错误,最好采取防御措施并包括检查以确保文件存在(或根据您的偏好捕获异常)。
【讨论】:
以上是关于不同编译模式下的奇怪bug的主要内容,如果未能解决你的问题,请参考以下文章