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);
        .....
      }

我想可能它必须做那台机器的非英语语言,有人可以告诉我这里有什么问题吗?

在 Hans Pasant 的评论之后添加

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

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

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

Brian Grinstead 发布的来自 C# 客户端的多部分表单

4

3 回答 3

2

这是一个文本编码问题。当您的代码在例如日语、韩语或中文的机器上爆炸时,您会得到这个。异常跟踪是使用机器的默认语言生成的。英文版看起来像:

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

其中at,inline部分消息将使用母语,使用 CJK 语言的字符字形。一切都将在您发布的代码段中运行。出了问题的是您将字符串从崩溃的机器获取到您的机器的操作。这个问题完全不清楚。但是,如果您使用电子邮件消息进行操作,那么您没有使用正确的 BodyEncoding。或者你这样做了,但你的电子邮件阅读器没有正确解释它。

的高发生率ãƒ使得原始文本很可能是用utf8编码的,当使用西方代码页时,它们是字符代码0xC3和0x83。这是代码点 U+30C0 及以上的 3 字节 utf-8 序列的前 2 个字节。分别是平假名和片假名字形。因此,您的程序很可能在日本机器上崩溃了。并且您在机器上使用 Encoding.Default 而不是 Encoding.UTF8 阅读文本

于 2012-06-02T13:04:48.237 回答
1

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

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

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

于 2012-06-02T09:45:11.963 回答
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 或用于发送序列化信息的异常。当在我自己的计算机上打开序列化信息时,查看器程序会从发生错误的源文件中添加行。

于 2012-06-02T10:05:00.787 回答