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 のコメントの後に追加

Web に投稿する前にスタック トレースをバイトに変換する次のコードがあります。

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.UTF8 の代わりに Encoding.Default を使用してテキストを読み取ること

于 2012-06-02T13:04:48.237 に答える
1

文化を使用していません。多分あなたは試してみるべきです:

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

String.FormatおよびInvariantCultureに関する詳細情報は MSDN にあります。

于 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 に答える