代码之家  ›  专栏  ›  技术社区  ›  okutane

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

  •  0
  • okutane  · 技术社区  · 14 年前

    我正在开发一些具有自动更新功能的应用程序。实现的思路简单如下:
    -有一些“starter”应用程序安装在“Program files/whatever/…”中。它是由用户启动的应用程序。
    -每次执行“starter”应用程序时,它都会检查服务器的更新,并将其下载到“%appdata%/some/…”。然后它从那个文件夹启动一些应用程序。

    上面的方法在我的开发机器(运行Vista)和其他一些XP下的机器上工作,但是在其他机器(运行Windows7)下不工作。当“starter”执行实际应用程序时,它会因一些未知问题(signature=system.unauthorizedAccess)崩溃。当从%appdata%/some/文件夹手动执行实际应用程序时,一切正常。我尝试在processstartinfo中设置相同的工作目录,所以“starter”也将在该文件夹中执行实际的应用程序,但这对我没有帮助。

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

    更新
    有关如何从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(startInfo);
    
    2 回复  |  直到 14 年前
        1
  •  2
  •   Serapth    14 年前

    至于您的问题,我认为崩溃很可能是由于缺少资源或依赖项或权限问题造成的。您是否尝试使用管理员权限运行应用程序?一般来说,自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");
    
        2
  •  2
  •   Joel Coehoorn    14 年前

    Windows7更改了一些应用程序数据位置和权限。确保使用“specialfolders”枚举 Environment 在.NET中类,而不是系统中的环境变量。

    我也可能尝试使用类似clickOnce或其他预构建的更新系统,而不是滚动我自己的系统。这可能比乍一看看起来更难纠正,而您现在遇到的这个问题只是其中一个原因。