2012-06-02 63 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