2012-06-02 62 views
1

我有一個程序會在崩潰的情況下向我報告錯誤/堆棧跟蹤,並且用戶希望發送它。堆棧跟蹤損壞字符

偶爾我會收到錯誤消息中的奇怪字符以及堆棧跟蹤,如下所示。

ファイルã¾ãŸã¯ã‚¢ã‚»ãƒ³ãƒ–リ 'Interop.iTunesLib, Version=1.11.0.0, Culture=neutral, PublicKeyToken=null'ã€ã¾ãŸã¯ãã®ä¾å­˜é–¢ä¿‚ã® 1 ã¤ãŒèª­ã¿è¾¼ã‚ã¾ã›ã‚「ã§ã—ãŸã€‚指定ã•ã‚ŒãŸãƒ•ã‚¡ã‚¤ãƒ«ãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚「。 


stack trace 
------------------------------------------------------ 
    å ´æ‰€ STLib.TInfo.Init(Form f) 
    å ´æ‰€ STLib.FormMain..ctor() å ´æ‰€ C:\repo_sync\ST\FormMain.cs:è¡Œ 37 
    å ´æ‰€ STLib.Program.Main() å ´æ‰€ C:\repo_sync\ST\Program.cs:è¡Œ 54 

我的代碼,構建了堆棧跟蹤看起來像這樣

private static void GlobalThreadExceptionHandler(object sender, System.Threading.ThreadExceptionEventArgs e) 
    { 
     ... 
     String stackTrace = ""; 
     Exception currentEx = e; 

     do 
     { 
      stackTrace += string.Format("\r\n{0}", currentEx.Message); 
      stackTrace += "\r\n------------------------------------------------------"; 
      stackTrace += string.Format("\r\n{0}", currentEx.StackTrace); 
      currentEx = currentEx.InnerException; 
      if (currentEx != null) 
      { 
       stackTrace += "\r\nCaused by"; 
      } 
     } 
     while (currentEx != null); 
     ..... 
     } 

我想大概有這樣做機器的非英語語言,可有人請告知我在此以什麼錯在這裏..

添加後漢斯Pasant的評論

我有以下代碼的堆棧跟蹤字節轉換髮布到網絡之前..

byte[] postdata = System.Text.Encoding.UTF8.GetBytes(stackTrace) 

我使用這裏

Multipart forms from C# client張貼由布賴恩格林斯蒂德

+0

可能會導致此問題的內存損壞。這一直在發生嗎? – Oded

+0

不是所有的機器,但有時當我得到報告,他們包含奇怪的字符 – Ahmed

+0

當我來自世界的非拉丁地區(例如阿拉伯)的用戶不時報告我的錯誤,我也會不時。我只是假裝我的字體不能正確顯示這些字符。應該與實際的錯誤無關。另一種選擇可能是某種混淆器。 –

回答

2

這是一個文本編碼問題。當你的代碼在例如日文,韓文或中文的機器上轟炸時,你會得到這個。異常跟蹤是使用機器的默認語言生成的。英文版本是這樣的:

at namespace.method(args) in C:\path\filename.cs:line 10

在消息的atinline零部件將在本地語言,使用字符字形的CJK語言。一切都會在你張貼的片段中工作。出現問題的是你如何將字符串從崩潰的機器傳送到機器。這個問題完全不清楚。但是,如果你說,用電子郵件的方式做,那麼你就沒有使用正確的BodyEncoding。或者你這樣做,但你的電子郵件閱讀器沒有正確解釋它。

ãƒ的高發病率使得原始文本可能以utf8編碼,當使用西方代碼頁時,它們是字符代碼0xC3和0x83。哪些是碼字U + 30C0及以上的3字節utf-8序列的前2個字節。哪些是平假名和片假名字形。因此,您的程序很可能會在日本機器上崩潰。並且您使用您的機器上的Encoding.Default而不是Encoding讀取文本.UTF8

+0

嗨,我已經添加更多的信息在你的評論後,你可以請看看我的問題。 – Ahmed

+0

我已經解決了,問題是Stacktrace查看器以錯誤的方式解釋文本後,我用另一個查看器與UTF-8它讀取它罰款。它絕對看起來像日本人或中國人:)標記你的答案是正確的。謝謝 – Ahmed

+0

這是日語。有趣的是:它實際上有所作爲:) –

1

您沒有使用文化完全相同的代碼發佈此數據。也許你應該嘗試:

CultureInfo culture = CultureInfo.InvariantCulture; 
string output = String.Format(culture, ..., ...); 

你會發現更多的信息在MSDN上關於String.FormatInvariantCulture

+0

謝謝丹尼爾我會嘗試,但有沒有辦法在我自己的機器上測試它。就像我可以改變我的操作系統的語言,以查看它是否被複制? – Ahmed

+0

@Ahmed,你可以改變一個線程文化,它應該改變格式和編碼行爲,如:http://msdn.microsoft.com/en-us/library/b28bx3bh(v=vs.80).aspx應該做的訣竅。 –

0

爲什麼字符出現我不知道,也許建議改變企業文化將幫助,但也有一個漂亮的方式來獲得不通過與System.Diagnostics.StackTrace異常對象預格式化堆棧信息。通過使用它你可以格式化你想要的堆棧,它可能不會顯示格式問題。當然不確定。儘管如此,它含有大量的有用信息

  //get stack trace information from Exception ex 
      StackTrace st = new StackTrace(ex, true); 

      foreach(StackFrame frame in st.GetFrames()) 
      { 
       //you can get file, file line number, column number, 
       //precise method info ets here 
      } 

我個人使用的包裝爲可以創建HTML或用來發送serialzed信息例外。當序列化信息在我自己的計算機上打開時,查看器程序會將錯誤發生處的源文件添加到行中。

+0

感謝羅伯特,你提供的信息是非常有用的。我會defintiely考慮到這一點.. – Ahmed