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

标签 c# mono unity3d

简而言之,我需要修改 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/

相关文章:

xcode - 您如何在 Unity/Mac 中重置或重新导入插件?

javascript - 如何创建在 Angular promise 中捕获的错误

c# - MSMQ CreateCursor NullReferenceException 异常

c# - Mono 命令行程序死于 "trace trap"消息,仅此而已

c# - 坐标轴的合适类型?

c# - 如何统一播放音频

c# - WHERE 子句 Azure CosmosDB Mongo 子文档

c# - 如何匹配/搜索特定的字典键?

c# - 为什么 DllImport 不适用于 "__Internal"?

.net - CouchDB - .NET 或 Mono 等效技术