我试图在不引发异常的情况下获取堆栈跟踪,并且它可以工作(人类可读),我唯一的问题是两种方法之间的格式不同。这是我在Unity中遇到的一个问题,因为它将解析从throw打开VS到相关行号的格式。因此,如果我使用新的StackTrace,则格式已关闭,双击Unity中的日志不会执行任何操作。如何获取新的stacktrace以匹配throw的stacktrace格式?
public class TestScript : MonoBehaviour
{
private void Awake()
{
string throwTrace = null;
string newTrace = null;
try
{
newTrace = new System.Diagnostics.StackTrace(0, true).ToString();
throw new Exception();
}
catch (Exception e)
{
throwTrace = e.StackTrace;
}
Debug.Log("throwTrace: {" + throwTrace + "}");
Debug.Log("newTrace: {" + newTrace + "}");
}
}
-
throwTrace: { at TestScript.Awake () [0x00013] in /Users/lol_tim/New Unity Project/Assets/TestScript.cs:17 }
newTrace: { at TestScript.Awake() in /Users/lol_tim/New Unity Project/Assets/TestScript.cs:line 16}
答案 0 :(得分:0)
看起来我可以通过双击乱码(不是很确定这是做什么用的)并重新调整格式以使其匹配来工作,至少在英语文化中如此。我不确定这是否适用于非英语文化(我在运行此代码之前曾尝试过更改我的文化,但由于某种原因,一切仍以英语显示)。当然,这是非常丑陋的,我希望有更好的方法。
System.Text.StringBuilder sb = new System.Text.StringBuilder(new System.Diagnostics.StackTrace(0, true).ToString());
sb.Remove(0, 1);
sb.Append(" ");
sb.Replace("(", " (");
sb.Replace(") in", ") [0x00000] in");
sb.Replace("\n ", " \n");
sb.Replace("line ", string.Empty);
newTrace = sb.ToString();