【发布时间】:2017-04-02 03:15:57
【问题描述】:
我一直在尝试获得一种在移动设备上运行时打印堆栈跟踪的可靠方法。我遇到了System.Environment.StackTrace
我现在正在尝试 3 个类:
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)
显然,由于我希望这是发布版本中的调试,它不会显示内部堆栈跟踪,而只会显示消息。
但问题在于堆栈跟踪本身,它甚至打印了方法at Test3.ActionThing(System.Action act) in <ProjectPath>\Test3.cs:line 10。我想跳过它显示在堆栈跟踪中。
任何帮助表示赞赏,在此先感谢。如果问题似乎太长,请提出修改建议:)
【问题讨论】:
-
为什么不希望堆栈跟踪中的
Test3.ActionThing(System.Action act)行?处理Environment.StackTrace并删除不需要的行将是一件简单的事情,但不清楚是什么让某些行可以接受而其他行不能接受 -
该方法的总体思路是通过它路由所有代码,这样如果它抛出错误,我可以在一个地方看到/打印它们。但是,如果调用的方法链太长,并且所有内容都通过该方法进行路由,则该字符串会相当长,并且会使错误不太容易快速理解,以及不必要的堆栈条目
-
我想你也不想要
System.Environment.get_StackTrace()? -
那也太棒了,但我不介意,因为这将是整个堆栈跟踪中的一次性打印。
标签: c# unity3d stack-trace