如何匹配新的StackTrace引发Exception.StackTrace

时间:2018-12-09 02:42:48

标签: c# debugging unity3d exception stack-trace

我试图在不引发异常的情况下获取堆栈跟踪,并且它可以工作(人类可读),我唯一的问题是两种方法之间的格式不同。这是我在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}

1 个答案:

答案 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();