gpt4 book ai didi

c# - 获取调用对象的哈希码?

转载 作者:行者123 更新时间:2023-11-30 14:17:23 25 4
gpt4 key购买 nike

这可能是重复的,但我还没有看到这个确切的问题或类似的问题问/回答的日期比 .Net 4 的发布日期更新。

我正在寻找一个临时 hack,它允许我查看调用堆栈并获取堆栈中的所有调用对象(不是方法,而是包含方法的实例)。最终我需要他们的哈希码。

这可能吗?

编辑:

无论它是否出现在我的问题中,实际上是在询问是否有一种简单/内置的方法可以做到这一点。真的,这只是一个权宜之计,直到我可以对系统的其他部分进行重大更改。感谢您的精彩回答。看到他们之后,我想我会等。 . . :)

最佳答案

你想在这里实现什么?

看看我大约一个月前回答的类似问题:How to get current value of EIP in managed code? .你可能会从中得到一些启发。或者您可能认为它太丑了(后者 +1)。

如果您只想在程序 session 中组装“唯一”调用路径,请继续:我非常肯定会使用 AOP 编织器和线程本地存储。那样不会太难。

注意事项 1:哈希对于通用 .NET 对象不是很有用

一个随机对象的哈希码可能会随着它在堆上的位置而变化。供引用:在 MONO 上,禁用移动堆分配器,Object::GetHash 是一段漂亮的代码 (mono/metadata/monitor.c)

#else
/*
* Wang's address-based hash function:
* http://www.concentric.net/~Ttwang/tech/addrhash.htm
*/
return (GPOINTER_TO_UINT (obj) >> MONO_OBJECT_ALIGNMENT_SHIFT) * 2654435761u;
#endif

当然,随着分配器的移动,要保证在对象的整个生命周期内哈希值保持不变,事情会稍微复杂一些,但是您明白了:每个运行时都会生成不同的哈希值,并且完成的分配量会改变 future 相同对象的默认哈希码。

警告 2:您的堆栈将包含外来帧

即使您通过提供适当的确定性散列函数修复了该部分,您仍需要每个堆栈帧都是“可识别”类型。情况可能不会如此。如果您使用类似于 LINQ、匿名类型、静态构造函数、委托(delegate)的任何东西,当然不会;各种各样的事情都可能与(匿名)帮助程序类型的堆栈帧交错,甚至是 JIT 编译器发明的用于优化尾递归的性能蹦床、大型开关跳转表或在多个重载之间共享代码。

要点:堆栈分析很难:如果您要进行分析,您绝对应该使用正确的 API。

结论:

一定要玩得开心。但要听从建议

  1. 您的要求是非标准的(由不支持它的运行时库加下划线);这通常表明:您正在解决一个独特的问题(但重新考虑选择的工具?)或者您正在以错误的方式解决它
  2. 通过使用一些手写模拟代码生成流程图而不是尝试连接到 CLR VM,您或许可以获得更多信息
  3. 如果您要这样做,请使用适当的 API(可能是探查器 API,因为采样探查器将准确保存此内容:每隔这么多指令堆栈“指纹”)
  4. 如果您真的必须通过检测代码来做到这一点,请考虑使用 AOP

关于c# - 获取调用对象的哈希码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6103034/

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