堆栈跟踪损坏的字符

时间:2012-06-02 09:36:51

标签: c#

我有一个程序,可以在发生崩溃时向我报告错误/堆栈跟踪,如果用户希望发送它。

我偶尔会在错误消息中收到奇怪的字符,也会在下面看到堆栈跟踪。

ファイルã¾ãŸã¯ã‚¢ã‚»ãƒ³ãƒ–リ '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);
        .....
      }

我想可能它必须使用那台机器的非英语语言,有人可以就此告诉我这里有什么错误。

在Hans Pasant的评论之后添加

我有以下代码,在发布到网络之前将堆栈跟踪转换为字节..

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

我使用与此处完全相同的代码发布此数据

Brian Grinstead发表了

Multipart forms from C# client

3 个答案:

答案 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

读取文本

答案 1 :(得分:1)

你没有使用文化。也许你应该尝试:

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

您可以在MSDN上找到有关String.FormatInvariantCulture的更多信息。

答案 2 :(得分:0)

为什么角色出现我不确定,也许正如建议改变文化会有所帮助,但是还有一种很好的方法来获取没有使用 System.Diagnostics.StackTrace System.Diagnostics.StackTrace预先格式化异常对象的堆栈信息EM>。通过使用它,您可以根据需要格式化堆栈,它可能不会显示格式问题。当然不确定。不过,它包含了很多有用的信息

            //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或用于发送序列化信息的异常。当序列化信息在我自己的计算机上打开时,查看器程序会在发生错误的源文件中添加这些行。