2011-07-19 62 views
2

我的應用程序適用於我的機器。但另一個用戶(他也可以在他的機器上使用它)表示在服務器上它不適合他。但服務器只是說「程序名稱已停止工作」。有一個「查看問題詳細信息」命令,但它並沒有告訴我足夠的:如何找出爲什麼我的應用程序「停止工作」?

Problem signature: 
    Problem Event Name:      CLR20r3 
    Problem Signature 01:      programname.exe 
    Problem Signature 02:      0.0.0.0 
    Problem Signature 03:      4e20a786 
    Problem Signature 04:      mscorlib 
    Problem Signature 05:      2.0.0.0 
    Problem Signature 06:      4d8c1599 
    Problem Signature 07:      f9b 
    Problem Signature 08:      80 
    Problem Signature 09:      System.IO.FileNotFoundException 
    OS Version:           6.1.7600.2.0.0.16.7 
    Locale ID:            1033 

Main()的第一個行安裝的是爲了顯示堆棧跟蹤的窗口的「未處理的異常處理」。直到現在,它運行良好。

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic); 
Application.ThreadException += ShowUnhandledException; 

有沒有什麼辦法可以得到一個調用堆棧?附:我需要它在下一小時;)

+0

加載外部文件並且不檢查錯誤? –

+0

不是我所知道的。 – Qwertie

+0

System.IO。FileNotFoundExcdeption會指示已找到SOMETHING ...可能是一個外部.dll,它被隱式加載並且未安裝在朋友的機器上。 –

回答

1

事實證明,我的安裝程序(MSI)在某個時候被破壞了,並沒有包括我的程序使用的7個DLL中的2個。

目前仍不清楚爲什麼ThreadException處理程序不起作用(.NET應該調用Main(),即使缺少DLL,因爲.NET會按需加載依賴項,而AFAIK只有UI線程正在運行;但是因爲它是固定的,所以不需要進一步調查。)

1

創建一個新項目。添加對您的真實項目的參考。在你的應用程序中,你可以使用Assembly.Load(「..」)方法來加載另一個項目,這可以在try..catch塊中完成。由於CLR會執行JIT編譯,因此您的新應用程序應該啓動(除非出現問題的不是特定於特定應用程序,而是與默認項目設置有關),啓動後應該能夠捕獲無論是否導致另一個失敗的堆棧跟蹤。以某種方式捕獲它(文件,電子郵件,數據庫)並讓其他用戶獲得此輸出。

至少這是我的理論。我沒有任何程序不會開始對此進行測試。至少不在你提供的時間框架內。

PS ==>如果您的包裝應用程序無法啓動,請嘗試創建一個簡單的「Hello world」控制檯應用程序,看看它是否會啓動。嘗試針對不同的.NET框架。創建幾個這些小應用程序來測試不同的設置。也許你的目標是64位平臺,服務器是32位?

編輯:不知道如何使這項工作,因爲當你添加一個項目引用到一個可執行的程序集,它不會創建一個.exe文件與第二個程序集的構建,看起來。所以看起來你只需要從另一個安裝的文件系統加載可執行文件...

3

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic);

只捕獲並顯示由於在UI線程上運行的事件處理程序而發生的異常。它不能替代AppDomain.CurrentDomain.UnhandledException,這是代碼在工作線程上崩潰時運行的事件。

但是您發佈的跟蹤給出了另一個問題的一些可能性:您的代碼在開始之前可能會崩潰。 System.IO.FileNotFoundException是在客戶端計算機上未確保正確版本的.NET安裝時引發的異常。輕鬆處理設置和部署項目。或者讓你的朋友啓用Windows Update。

+0

缺乏正確的框架也是我的建議,通常是應用程序即使沒有顯示某些用戶界面也會立即崩潰的原因。 – slugster

相關問題