堆栈跟踪损坏的字符

本文关键字:字符 损坏 跟踪 堆栈 | 更新日期: 2023-09-27 18:36:01

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

偶尔,我在错误消息中收到奇怪的字符,并且还会在堆栈跟踪中看到,如下所示。

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

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

在汉斯·帕桑特的评论之后添加

我有以下代码,可以在发布到 Web 之前将堆栈跟踪转换为字节。

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

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

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

堆栈跟踪损坏的字符

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

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 阅读文本

您没有使用区域性。也许你应该尝试:

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

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

为什么会出现这些字符我不确定,也许按照建议改变区域性会有所帮助,但还有一种漂亮的方法可以使用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 或用于发送序列化信息的异常使用包装器。当我自己的计算机上打开序列化信息时,查看器程序会将发生错误的源文件中的行添加出来。