2012-09-12 56 views
0

我正在爲windows移動設備 - 摩托羅拉ES400開發一個.net cf應用程序。Windows Mobile上的.NET CF應用程序在全局異常處理程序中沒有詳細信息凍結

應用程序維護一個日誌文件,該文件記錄所有處理的異常以及在Main方法中在應用程序全局範圍內註冊的未處理的全局異常。

出於某種原因,當我在手機上運行應用程序時,應用程序只是凍結 - 這意味着我無法單擊應用程序上的任何按鈕或使用手寫筆執行任何其他操作。該應用程序完全沒有響應。當我回到手機Windows Mobile OS開始菜單 - >任務管理器,並試圖關閉應用程序,我不能。任務管理器不會關閉應用程序。當我檢查日誌時,我看不到任何通過註冊未處理的全局例外例程記錄的未處理的異常。

我不明白這裏可能是什麼問題。

有沒有人有任何想法可能發生什麼根據您的經驗與.NET CF?我可以開始尋找或分析的任何地方?

在此先感謝您的幫助。

Subbu

回答

0

如果您遇到硬故障(操作系統級別的錯誤,例如memeory訪問衝突),那麼我在Dr. Watson日誌創建時看到系統凍結。

在ES400上,我不記得是否有一個控制面板小程序來配置錯誤報告功能,但在那裏檢查。

如果它正在創建這樣的日誌,默認情況下,我認爲它會在\ windows下的子文件夾中。但整個過程,如果可以通過註冊表配置,所以你可能想看看那裏。

看到這裏的主題一般:

http://msdn.microsoft.com/en-us/library/ee481217(v=winembedded.60).aspx

這裏專門爲註冊表設置:

http://msdn.microsoft.com/en-us/library/ee480226(v=winembedded.60).aspx

+0

謝謝!這有助於。 – Subbu

2

可能有很多原因。根據我的經驗,我想有一些無限循環或調用一些鎖定的資源正在發生。在這種情況下,請嘗試使用.NET CF的CLR Profiler。 CLR Profiler可以告訴你什麼是錯誤的,在哪裏。 你可以從這裏得到它:http://www.microsoft.com/en-us/download/details.aspx?id=13442 以及如何使用它,還有一系列博客文章,請訪問:http://blogs.msdn.com/b/stevenpr/archive/2008/05/08/the-clr-profiler-for-the-net-compact-framework-series-index.aspx

我希望它能幫助。

0

我前段時間遇到過類似問題。我當時正在使用條碼掃描器驅動程序創建一個單獨的線程並循環掃描條形碼。當我試圖退出應用程序時,它會等待線程停止,導致應用程序凍結,直到掃描條碼。任務管理器也無法結束應用程序。

我相信如果你有一個前臺線程(Thread.IsBackground = FALSE),這將防止進程終止,直到它已經結束了 - http://msdn.microsoft.com/en-us/library/system.threading.thread.isbackground.aspx

所以你的問題可能是從你開始了一個輔助線程。如果你正在等待一個線程,通過一個鎖或類似的東西,並且該線程處於無限循環,那麼這可能是你的問題的原因。對於一個accedental無限循環,我最常見的原因是引用屬性的屬性getter而不是後備變量。

我希望這有些幫助。

+0

感謝您的答覆。我已經爲應用程序中使用的每個線程實現了這一點,因爲這種方法可以保證在主線程關閉時關閉線程。 – Subbu

+0

@Subbu:你應該給每個花時間給你答覆的人(+1)......除非他們告訴你做錯了什麼! – jp2code

0

如果你只是想捕捉和記錄這個錯誤,然後在您的程序的主要函數的周圍放置一個try...catch

在C#中,這將是簡單的編輯Program.cs從這樣的事情:

static void Main() { 
    Application.Run(new Form1()); 
} 

爲了這樣的事情:

private static Form1 m_form; 

static void Main() { 
    try { 
    m_form = new Form1(); 
    Application.Run(m_form); 
    } catch (Exception err) { 
    // log error 
    if ((m_form != null) && !m_form.IsDisposed) { 
     // you might want to save data on your form before it goes Bye-Bye. 
    } 
    } 
} 
+0

這是我們使用的方法。將日誌或事件寫入數據庫通常證明問題太多。至少如果異常在源代碼中被捕獲並顯示出來,用戶就會得到一條消息,告訴他們支持。 –

+0

感謝您的回覆。 – Subbu