【问题标题】:How to match new StackTrace to throw Exception.StackTrace如何匹配新的 StackTrace 以抛出 Exception.StackTrace
【发布时间】:2018-12-09 02:42:48
【问题描述】:

我试图在不引发异常的情况下获取堆栈跟踪,并且它可以工作(人类可读),我唯一的问题是两种方法之间的格式不同。这是我在使用 Unity 时遇到的一个问题,因为它将格式从 throw 解析为 open VS 到关联的行 #。因此,如果我使用新的 StackTrace,格式会关闭,双击 Unity 中的日志不会执行任何操作。如何获取新的堆栈跟踪以匹配 throw 的堆栈跟踪格式?

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}

【问题讨论】:

  • 2 年后......显然这只是 Unity 的 .Net 3.5 运行时中的一个问题。 .Net 4.x 运行时已解决此问题。

标签: c# debugging unity3d exception stack-trace


【解决方案1】:

看起来我可以通过替换乱码(不确定它的用途)并重新调整格式以匹配,至少在英语文化中可以让双击工作。我不确定这是否适用于非英语文化(我尝试在运行此代码之前更改我的文化,但由于某种原因,所有内容仍然以英语出现)。当然,这非常丑陋,我希望有更好的方法来做到这一点。

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

【讨论】:

    猜你喜欢
    • 2021-08-03
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 2019-06-01
    • 2016-05-04
    • 1970-01-01
    • 2017-02-17
    • 1970-01-01
    相关资源
    最近更新 更多