我有一个程序,可以在发生崩溃时向我报告错误/堆栈跟踪,如果用户希望发送它。
我偶尔会在错误消息中收到奇怪的字符,也会在下面看到堆栈跟踪。
ファイルã¾ãŸã¯ã‚¢ã‚»ãƒ³ãƒ–リ '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发表了答案 0 :(得分:2)
这是一个文本编码问题。当您的代码在日本,韩国或中国的机器上炸弹时,您就会得到这个。使用计算机的默认语言生成异常跟踪。英文版看起来像:
at namespace.method(args) in C:\path\filename.cs:line 10
其中消息的at
,in
和line
部分将使用母语,使用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.Format和InvariantCulture的更多信息。
答案 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或用于发送序列化信息的异常。当序列化信息在我自己的计算机上打开时,查看器程序会在发生错误的源文件中添加这些行。