gpt4 book ai didi

c# - 我可以更改 C# 中的当前堆栈跟踪吗?

转载 作者:太空狗 更新时间:2023-10-29 19:39:11 24 4
gpt4 key购买 nike

简而言之,我需要修改 C# 中的当前堆栈跟踪,以便我调用的方法(我无法修改)会认为是其他人调用了它。

现在,让我来解释一下为什么我需要进行如此糟糕的黑客攻击。

在 Unity3d 中,Debug.Log在开发人员控制台中创建新记录。当您双击它时,它会打开 IDE 以显示负责该记录的确切文件和行。但是,由于各种原因(在生产中禁用调试,使其在其他线程中可用),我创建了一个包装类 Print 来代替 UnityEngine.Debug。

但是有了 wrapper,现在当开发人员点击控制台中的日志记录时,打开的是 Print,而不是调用 Print.Log 的实际位置.由于 Debug.Log 执行此操作而不考虑错误消息或上下文对象,我认为它使用调用堆栈来识别要打开的文件。不用说,我想解决这个问题。

最佳答案

我不认为这是可能的。查看Environment.StackTrace的源代码和随后的 GetStackTrace()打电话我们可以看到它creates the stacktrace每次每当它被调用时。由于似乎没有任何东西可以注入(inject)来改变它的某些工作,我认为可以肯定地得出结论,如果不修改堆栈跟踪的调用方式,就无法更改堆栈跟踪。

如果你有可能这样做,你可以使用类似这样的东西来检索当前的堆栈跟踪并使用反射来更改最近的 StackFramemethod 字段来模拟您所追求的。

void Main()
{
DoSomething();
}

void DoSomething(){
Console.WriteLine (Environment.StackTrace); // Last frame: at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)

var frames = new StackTrace().GetFrames();
var lastframe = frames[0]; // last frame: DoSomething at offset 100 in file:line:column <filename unknown>:0:0
var methodField = lastframe.GetType().GetField("method", BindingFlags.Instance | BindingFlags.NonPublic);
var redirectedMethod = typeof(Redirect).GetMethod("RedirectToMethod", BindingFlags.Instance | BindingFlags.Public);
methodField.SetValue(lastframe, redirectedMethod);
Console.WriteLine (frames); // last frame: RedirectToMethod at offset 100 in file:line:column <filename unknown>:0:0
Console.WriteLine (Environment.StackTrace); // last frame: at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
}

public class Redirect {
public void RedirectToMethod() { }
}

但再一次:这非常脆弱,不适用于您当前的情况。您正在尝试做的事情相当奇特,可能应该完全避免。

至于一个实际的解决方案:恐怕我没有任何使用 Unity 的经验所以我只能谷歌但是 this thread你可能会感兴趣。我在这里提到了 .NET 资源,但你可以找到 very similar code在 Mono 源代码中。

关于c# - 我可以更改 C# 中的当前堆栈跟踪吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25244325/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com