2017-04-01 3 views
0

私は実行時にモバイルデバイス上でスタックトレースを確実に印刷するように努力してきました。私はこれがしたいので、スタックトレースに特定のメソッドが表示されないようにする

public class Test : MonoBehaviour { 
    public static void Do() { 
     Test3.ActionThing(() => { 
      Test2.DoSomethingElse(); 
     }); 
    } 
} 


public class Test2 : MonoBehaviour { 
    void Start() { 
     Test3.ActionThing(() => { 
      Debug.Log("Start execution"); 
      Test.Do(); 
     }); 
    } 

    public static void DoSomethingElse(){ 
     Test3.ActionThing(() => { 
      var a = 0; 
      a = int.Parse("s1"); 
     }); 
    } 
} 

public class Test3 : MonoBehaviour { 
    public static void ActionThing(Action act){ 
     try{ 
      if (act != null) 
       act(); 
     }catch(Exception e){ 
      Debug.LogError("Error occured " + e.Message); 
      Debug.LogError("StackTrace was " + Environment.StackTrace); 
     } 
    } 
} 

は、私は、エラーが明らかに

StackTrace was at System.Environment.get_StackTrace() in /Users/builduser/buildslave/mono/build/mcs/class/corlib/System/Environment.cs:line 227 
    at Test3.ActionThing(System.Action act) in <ProjectPath>\Test3.cs:line 13 
    at Test2.DoSomethingElse() in <ProjectPath>\Test2.cs:line 14 
    at Test.<Do>m__0() in <ProjectPath>\Test.cs:line 8 
    at Test3.ActionThing(System.Action act) in <ProjectPath>\Test3.cs:line 10 
    at Test.Do() in <ProjectPath>\Test.cs:line 7 
    at Test2.<Start>m__0() in <ProjectPath>\Test2.cs:line 9 
    at Test3.ActionThing(System.Action act) in <ProjectPath>\Test3.cs:line 10 
    at Test2.Start() in <ProjectPath>\Test2.cs:line 7 
UnityEngine.Debug:LogError(Object) 
Test3:ActionThing(Action) (at Assets/Test3.cs:13) 
Test2:DoSomethingElse() (at Assets/Test2.cs:14) 
Test:<Do>m__0() (at Assets/Test.cs:8) 
Test3:ActionThing(Action) (at Assets/Test3.cs:10) 
Test:Do() (at Assets/Test.cs:7) 
Test2:<Start>m__0() (at Assets/Test2.cs:9) 
Test3:ActionThing(Action) (at Assets/Test3.cs:10) 
Test2:Start() (at Assets/Test2.cs:7) 

をスローされ、このスタックトレースを取得する:私は今、3つのクラスで何かをしようとしていますSystem.Environment.StackTrace

に出くわしましたリリースビルドのデバッグでは、内部スタックトレースとメッセージのみを表示しません。

しかし、問題はstacktrace自体にあり、そこでメソッドat Test3.ActionThing(System.Action act) in <ProjectPath>\Test3.cs:line 10を出力します。私はこれをスタックトレースに現れないようにしたい。

 

すべてのヘルプは、事前に感謝を感謝しています。質問が長すぎると思われる場合は、編集を提案してください:)

+0

へのアクセスを得るusing System.Linqを追加するために覚えていますか? 'Environment.StackTrace'を処理して不要な行を削除するのは簡単なことですが、いくつかの行を受け入れられるものとできないものは明確ではありません。 –

+0

そのメソッドの一般的な考え方は、エラー、私は1つの場所でそれらを見る/印刷することができました。しかし、呼び出されるメソッドの連鎖が長すぎて、すべてのメソッドがこのメソッドを介してルーティングされている場合、この文字列はかなり長くなり、不要なスタックエントリとともにエラーを簡単に理解しにくくなります – Shraa1

+0

私はあなたが'System.Environment.get_StackTrace() 'が必要ですか? –

答えて

0

最も単純なアプローチは、単にEnvironment.StackTrace文字列を処理し、気にしないスタックフレームを単純に処理することです。我々はrelevantStackFramesに割り当てる

public static void ActionThing(Action act){ 
    try{ 
     if (act != null) 
      act(); 
    }catch(Exception e){ 
     var relevantStackFrames = 
      Environment.StackTrace 
       .Split('\n') 
       .Skip(2) 
       .ToArray(); 
     var relevantStackTrace = string.Join("\n", relevantStackFrames); 
     Debug.LogError("Error occured " + e.Message); 
     Debug.LogError("StackTrace was " + relevantStackTrace); 
    } 
} 

線は、対応するスタックフレームのためのラインである各要素と、文字列の配列にスタックトレース文字列を分割します。 System.Environment.get_StackTrace()Test3.ActionThing(System.Action act)のスタックフレームは、この配列の最初の2つの要素であり、それらを必要としないので、linqのSkip関数を使用してそれらをコレクションから除外します。次に、スキップ操作の結果をToArrayの配列に変換します。だから、relevantStackFramesはあなたが望まないものを除いたスタックフレーム列の配列です。

次に、スタックトレース全体の文字列を含むrelevantStackTraceという文字列を作成します。 relevantStackTraceの各要素を結合して、改行をstring.Joinに戻します。

ので、あなたがスタックトレースに `Test3.ActionThing(System.Action行為)`ラインを望んでいないのはなぜSkipToArray

+0

私は以前にtoarrayとstring.Joinを使用しました。私はSkipをまだ使用していないので、どのように動作するのか分かりません。しかし、メソッド名で推測すると、スタックトレースの分割配列から2番目の要素をスキップします。これはハードコーディングされた値であり、メソッド連鎖が異なる場合、常に動作しない可能性があります。 – Shraa1

+0

私は自分自身で文字列の操作を考えていましたが、私はその文字列の大ファンではありません。私はこの答えを受け入れるでしょう、これがうまくいけば、よりよい解決策はありません。ありがとうございました – Shraa1

+0

ハードコードされた値は、このケースでは問題ではないと思います。スキップするフレームの数(エラー処理関数と呼び出しスタックゲッター)を常に正確に知っているからです。しかし、本当に必要な場合は、興味のない関数を含むスタックフレームをフィルタリングするなど、もっと複雑な処理を行うことができます。 –

関連する問題