问题标签 [vmt]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
3829 浏览

delphi - 我在哪里可以找到有关 Delphi VMT 结构的信息?

System.pas 文件包含大量有关硬编码 VMT 偏移的信息,但它似乎并没有真正说明 VMT 本身的结构。我真正想知道的是,有没有办法在运行时找出 VMT 的大小,或者换句话说,给定类存在多少虚拟方法?

0 投票
10 回答
2704 浏览

delphi - 在 Delphi 中检测 VMT 或堆损坏的正确工具是什么?

我是一个将 Delphi 2007 用于大型应用程序的团队的成员,我们怀疑堆损坏,因为有时会出现没有其他解释的奇怪错误。我相信编译器的 Rangechecking 选项仅适用于数组。我想要一个工具,当在应用程序未分配的内存地址上写入时,它会给出异常或日志。

问候

编辑:错误类型:

错误:模块“BoatLogisticsAMCAttracsServer.exe”中地址 00404E78 的访问冲突。读取地址 FFFFFFDD

EDIT2:感谢所有建议。不幸的是,我认为解决方案比这更深。由于我们拥有源代码,因此我们为 Delphi 使用了 Bold 的补丁版本。可能在 Bold 框架中引入了一些错误。是的,我们有一个日志,其中包含由 JCL 处理的调用堆栈以及跟踪消息。所以带有异常的调用栈可以像这样锁定:

内部异常部分是重新引发异常时的调用堆栈。

EDIT3:现在的理论是虚拟内存表(VMT)以某种方式损坏。当这种情况发生时,没有任何迹象。只有在调用方法时才会引发异常(始终在地址 FFFFFFDD,-35 十进制),但为时已晚。您不知道错误的真正原因。任何关于如何捕获这样的错误的提示都非常感谢!!!我们尝试过使用 SafeMM,但问题是即使使用 3 GB 标志,内存消耗也太高。所以现在我试着给 SO 社区一个赏金:)

EDIT4:一个提示是,根据日志,在此之前经常(甚至总是)另一个异常。例如,它可以是数据库中的乐观锁定。我们试图强制引发异常,但在测试环境中它工作正常。

EDIT5:故事还在继续……我现在对过去 30 天的日志进行了搜索。结果:

  • “读取地址 FFFFFFDB” 0
  • “读取地址 FFFFFFDC” 24
  • “读取地址 FFFFFFDD” 270
  • “读取地址 FFFFFFDE” 22
  • “读取地址 FFFFFFDF” 7
  • “读取地址 FFFFFFE0” 20
  • “读取地址 FFFFFFE1” 0

所以目前的理论是一个枚举(有很多粗体)覆盖一个指针。我在上面得到了 5 个不同地址的点击。这可能意味着枚举包含 5 个值,其中第二个是最常用的。如果出现异常,则应为数据库进行回滚,并且应销毁 Boldobjects。也许不是所有东西都被破坏了,枚举仍然可以写入地址位置。如果这是真的,也许可以通过正则表达式搜索代码以查找具有 5 个值的枚举?

EDIT6:总而言之,还没有解决问题的方法。我意识到我可能会用调用堆栈误导你。是的,其中有一个计时器,但还有其他没有计时器的调用堆栈。对此感到抱歉。但有两个共同因素。

  • 读取地址 FFFFFFxx 的异常。
  • 调用堆栈的顶部是 System.TObject.InheritsFrom (sys\system.pas:9237)

这让我相信VilleK最能描述这个问题。我也确信问题出在 Bold 框架的某个地方。但最大的问题是,如何解决这样的问题?仅仅有一个像VilleK这样的断言是不够的,因为损坏已经发生并且调用堆栈在那一刻已经消失了。因此,描述我对可能导致错误的原因的看法:

  1. 某个地方的指针被分配了一个错误的值 1,但它也可以是 0、2、3 等。
  2. 一个对象被分配给该指针。
  3. 对象基类中有方法调用。这会导致方法 TObject.InheritsForm 被调用,并且地址 FFFFFFDD 上出现异常。

这 3 个事件可以在代码中一起使用,但也可以在以后使用。我认为这对于最后一个方法调用是正确的。

EDIT7:我们与 Bold Jan Norden 的作者密切合作,他最近在 Bold 框架中的 OCL 评估器中发现了一个错误。修复此问题后,这些异常减少了很多,但它们仍然偶尔会出现。但这是一个很大的安慰,这几乎解决了。

0 投票
1 回答
336 浏览

windows - TObject 虚拟方法的签名更新到 Delphi XE2

目前,Delphi XE 仅在我的机器上可用,我不知道 Delphi 2010/XE2 是否引入了一些重大更改。

请帮我更新以下定义:

提前致谢。


我需要的信息可以从单位system.pas中获取。当我将其作为 Delphi XE 版本进行检查时,我还发现 VMT 依赖于 CPU(归咎于我,很明显/搜索{$IF defined(CPUX64)}指令以获取更多详细信息)。

我对 32 位 Windows 平台感兴趣。

0 投票
1 回答
319 浏览

delphi - 如何检查传递的参数是否是类?

我有功能(用 Delphi 7 32 位编写):

它返回 VMT 地址(我认为它是 VMT,我不确定)并检查参数是否是一个对象(通过try...except,这是恕我直言的糟糕解决方案)。
我有两个问题:
1)这真的是 VMT 地址还是我错了?
2)有没有更好的解决方案来检查参数是一个对象?

0 投票
1 回答
267 浏览

pascal - Free Pascal 上的虚拟方法表

我想要做的是在没有实例的情况下获取类中的字段列表......例如:

我无法从 VMT 获取 fieldTable:

这样我就不会得到字段列表

欢迎任何帮助,在此先感谢

0 投票
1 回答
151 浏览

c++ - Changing VTable entries doesnt redirect function?

I have 3 classes (Cat, HouseCat:Cat, Lion:Cat). What I'm trying to do is change HouseCat's VTable to make HouseCat eat Meat instead of cat food.

Classes I Use:

I'm trying to edit those classes' VTable entries by a VTable struct I created.

I confirmed that VTable[0] = eat(), so i decided to try making a change on the Vtable like this :

It outputed;

You can see that HomeCat[0] changed from 0x311285->0x31106E

The problem is the output of the functions didnt change at all.

---Base---

Meat2

Meow!2

---Lion---

Meat2

ROAR!2

---Home---

Cat Food2

Meow!2

---End---

I'm using Visual Studio 2013. Release/Debug didnt make a difference either.

Did i do something wrong in my code or is it somekind of compiler stuff I'm missing?

0 投票
2 回答
961 浏览

c++ - 完全覆盖 VMT(虚拟方法表)

我通过取消引用来调用 vmt 上的虚拟方法,直到获得指向该方法的指针。

这一切都很好,但是,我将如何完全更改指向对象上 VM 表的指针?

例子:

聚丙烯; // 指向它的默认 VM 表

聚丙烯乙; //指向一个完全不同的VM表

A->MethodOne() // 如上所述的调用

B->MethodOne() // 调用完全不同的方法,因为我们将其指向 VM 表的指针覆盖为具有不同方法指针的备用表

我将如何做到这一点?

我的代码:

0 投票
4 回答
1991 浏览

c++ - C++ 获取虚函数表索引

是否有可能(以及如何)在虚方法表中获取虚函数的索引?

我知道foo是虚拟方法表中的第一个 (0) 项

但是我可以拥有foo并获得 0 吗?

0 投票
2 回答
411 浏览

delphi - 如何获取 VMT 中的条目数(虚拟方法)?

在正偏移处,VMT 存储指向所有用户定义的虚拟方法的指针。
我需要编写一些代码来挂钩 VMT。我这样做的方法是获取指向祖先类中的虚拟方法的指针。
比方说:TCustomForm.ShowModal。然后我在 VMT 中查找偏移量TCustomForm。有了这个偏移量,我去TMyForm更改它的 VMT 以指向我需要的功能。

我想概括一下这种方法,为了做到这一点,我想知道 VMT 拥有的条目总数,所以我不会搜索到最后。

如何获取 VMT(用户可定义部分)的大小?

0 投票
1 回答
213 浏览

c++ - 如何确定 VMT 指针的计数

使用 Visual C++ 编译器,每个类对象都有VMT(对象中的第一个指针),它是指向类中每个方法的指针数组的指针。使用这样的代码:

这段代码枚举了类中的前 100 个函数,但是考虑到我没有类定义,我如何确定类有多少指针?如何动态找出它?

谢谢!