如何诊断和修复dotnet应用程序的“现场”崩溃?

时间:2010-06-14 19:11:10

标签: .net

我正在开发一些具有自动更新功能的应用程序。实施的想法很简单如下:
  - 有一些“启动”应用程序安装到“Program Files / whatever / ...”。这是应用程序,旨在由用户启动   - 每次执行“starter”应用程序时,它会检查服务器是否有更新并将其下载到“%APPDATA%/ some / ...”。然后它从该文件夹启动一些应用程序。

上面的方法是在我的开发机器上运行(运行Vista)和在XP下的其他一些机器上,但是在一些不同的机器(运行Windows 7)下它无法正常工作。当“starter”执行真正的应用程序时,它会崩溃并出现一些未知问题(Signature = System.UnauthorizedAccess)。当从%APPDATA%/ some /文件夹手动执行真正的应用程序时,一切正常。我试图在ProcessStartInfo中设置相同的工作目录,因此“starter”也会在该文件夹中执行真正的应用程序,但这对我没有帮助。

如何诊断和/或解决该问题?

更新
有关如何从启动器运行主进程的更多详细信息:

        private static readonly string _ROOT = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "MyApp");
...
        private static void Run()
        {
            string startPath = Path.Combine(_ROOT, "MyApp.exe");
            ProcessStartInfo startInfo = new ProcessStartInfo();
            startInfo.FileName = startPath;
            startInfo.WorkingDirectory = _ROOT;
            Process.Start(startPath);
        }

这肯定会启动正确的进程,因为可以看到应用程序窗口,但Windows可能会拒绝某些磁盘或网络操作,并且启动进程崩溃。
更新
跟踪显示工作目录不正确,并且在我的代码中指向了不正确的Process.Start(string)方法调用。正确的一行:

    Process.Start(startInfo);

2 个答案:

答案 0 :(得分:2)

Windows 7更改了部分应用数据位置和权限。确保您使用.Net中Environment类的“SpecialFolders”枚举,而不是系统中的环境变量。

我也可能尝试使用像ClickOnce或其他预先构建的更新系统,而不是自己动手。这比第一眼看上去更难做到,而你现在遇到的这个问题只是其中一个原因。

答案 1 :(得分:2)

至于你的问题,我给出了崩溃来自丢失的资源或依赖或其权限问题的可能性。您是否尝试使用管理员权限运行应用程序?通常,自Xp以来每个版本的Windows都受到越来越多的限制,尤其是.net运行时。您是否依赖第三方库或DLL?

对于诊断问题,假设您无法访问远程计算机上的调试器,最好的办法是充分利用System.Diagnostics.Trace。您可以从app.config配置跟踪,并使跟踪重定向到本地文件足够简单。还要确保检查事件查看器是否存在任何应用程序级别异常。

随着时间和足够的跟踪声明,您应该足够快地找到问题。

启用跟踪就像在app.config中添加以下内容一样简单。

<system.diagnostics>
    <trace autoflush="true" indentsize="3">
      <listeners>
        <add name="fileOutListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="C:\Path.to\File\debug.log" />
      </listeners>
    </trace>
  </system.diagnostics>

然后在整个代码中添加:

System.Diagnostics.Trace.Writeline(System.DateTime.ToString() + " :: I am currently at XX location doing YY");