2012-02-10 60 views
0

似乎沒有辦法訪問在通用用戶的非調試版Flash上​​運行的Flex應用程序發佈版本的堆棧跟蹤。我仍然可以訪問錯誤編號,但在某些情況下這還不夠好。在已發佈的Flex應用程序中調試運行時錯誤

想知道如果有人有任何提示如何解決這個問題。我能想到的只是在儘可能多的事件中記錄一些緩衝區,然後在發生崩潰時將其轉儲到服務器。我已經實現了這一點,沒關係,但不幸的是,如果您的代碼基礎相當廣泛,那麼在整個地方添加日誌記錄似乎並不實際。但是也許有一種方法可以用我沒有想到的一些簡單方式記錄各種各樣的東西 - 某種集中的聽衆?或者,也許還有其他方法?

會採取任何建議(雖然理想情況下跳過「你應該測試你的應用程序,然後再釋放它」?)。

謝謝!

回答

3

不幸的是,在這一點上你可以做很多事情。顯而易見的地方當然是試圖讓用戶在Flash Player的調試版上運行程序。但是,如果你不能,你需要找到一種方式,一個「包羅萬象」的一種方式運行時錯誤檢測到「在建」,只有兩個直接的補救措施,我能想到的:

  1. 在應用程序中的關鍵點插入默認日誌消息。這應該處於更高的抽象層次,可能在創建或刪除模塊時,或者開始和完成複雜任務時。理想情況下,日誌記錄也應該是可配置的,以便您可以在需要時打開或關閉詳細輸出,例如通過更改配置文件或在編譯過程中設置環境變量 - 調試代碼可能會使您的應用程序變慢一點,並且您不希望每次出現錯誤時都必須添加和刪除單個跟蹤語句。如果您是一位高級ActionScript開發人員,您甚至可能希望找到一種通過元數據和/或自定義名稱空間實現日誌記錄的方法 - 這是一種更簡潔的方法。

  2. catch-all approach應用於您的整個應用程序,並追蹤堆棧中的每個錯誤。也許這並不比你已經有的更明確,但至少你可以乾淨地關閉程序(例如,向用戶顯示一條消息),而不是讓它崩潰。

很不幸,你已經創建你的程序有一個「不要告訴我測試之前,我釋放」的態度 - 有隻是沒有很多事情可以「回想」這樣做,除了火調試器,並加入一些額外的時間。事實上,你應該測試每一行代碼,然後你甚至會寫出它 ......但我不會去 - TDD通常是需要更多解釋而不是單個答案的東西。

下面是一些簡單的事情可以做,以使你的生活在未來更容易:

的最大的錯誤,人們普遍提出的,是不要讓錯誤發生在首位:如果,例如,您有許多null -checks在應用程序代碼:

if (myVar != null) doMyStuff(); // or 
if (myVar == null) return; 

這通常用於防止可怕的#1009錯誤的顯示出來,這是比較有效的,乍一看它比使用try...catch塊更快。但它也將掩蓋問題的根源,或者甚至讓它不被注意:您的錯誤可能會在稍後出現,其他地方應該已經在doMyStuff()中初始化,或者可能有些地方您只是忘記了檢查。

成爲無差錯的最佳策略是:

  • 不返回,或者分配非法值(例如,不要讓你的函數返回null,分配初始值的所有變量等)

  • 執行try...catch在應用程序中的關鍵點(無論什麼時候出現問題,本質上)。然後,這些會在發現錯誤時發送詳細的日誌消息,因此您無需訴諸冗長的調試會話就可以輕鬆發現原因。

  • 創建自我驗證對象。我喜歡有一個verify()方法,該方法在對象初始化或添加到舞臺之前調用,檢查所有必需的依賴項 - 如果缺少任何內容或具有錯誤的值,則會拋出InstantiationException

+0

謝謝 - 這些都是好想法。 – 2012-02-11 18:11:52

0

我試過一次,一個簡單的項目:我寫了一個腳本,該分析的源代碼,並插入一些代碼,將在進入功能推函數名和堆棧參數,而在退出時,會彈出堆棧的名稱和參數。

有某些情況下,當這是不夠的或者很難做雖然:

  1. 如果你扔在你的代碼捕獲錯誤(我從來沒有這樣做,所以這是從來沒有的對我而言),那麼一旦捕獲到錯誤,您就需要一些額外的功能來從堆棧中彈出很多元素。

  2. 我總是以某種方式編寫我的代碼,函數中最後一行也是唯一的最後一行從函數返回,所以我很容易找到所有應該從堆棧中彈出元素的地方 - 但你可能需要更復雜的算法。

  3. AS3具有極其複雜的語法,因此編寫100%正確的預處理器是一項非常繁瑣的任務。我已經接受預處理器在與E4X一起使用時可能產生錯誤的代碼,如果是這樣的話,必須手動修復它。

0

我遵循weltraumpirat的答案,並添加一些更好的'最佳實踐'。實現另一個只保存字符串數組的記錄器。您應該在應用程序的大部分地方使用日誌記錄。這樣你就可以擁有一個人造棧跡。通過在啓動時加載配置xml或其他內容,使內存調試器的日誌級別可以通過Web服務器進行控制。添加全局故障和錯誤處理程序,並將它們集中在一個點上。用ie構建一個錯誤值對象。球員的能力,artific。堆棧跟蹤,組織。錯誤消息等,並嘗試通過遠程調用發送到服務器。

相關問題