【问题标题】:Monitor certain part of memory for changes, such as data of record监视内存的某些部分是否发生变化,例如记录数据
【发布时间】:2015-03-23 02:28:22
【问题描述】:

我正在尝试阅读根据 MSDN 应为 VT_UI4 类型的信息, 相当于Cardinal

有问题的值是 WPD 设备WPD_STORAGE_TYPE,它指示设备中存在什么类型的存储。

MSDN 文章建议使用程序GetUnsignedInteger(), 但在 Delphi 中,它一直给我一个错误。

但是在 Microsoft WPDInfo 调试应用程序中,代表我需要阅读的内容的值非常正确地呈现。

但是,当使用过程 GetValue() 填充 tag_inner_PROPVARIANT 时,不会返回错误,但我找不到要读取的正确值。

我已经使用CompareMem 进行了测试,方法是比较两个tag_inner_PROPVARIANT,然后调用GetVaue() 填充其中一个,然后再次比较它们,实际上是传递给GetValue()被填充。

我也查看了填充的 tag_inner_PROPVARIANT 中的指针 在填充之前和填充之后,从pcValpdblVal 的指针都在填充之后分配。

因此,通过使用 CPU 窗口或 Delphi 中的某种工具,应该可以指示正在更改的值。对吧?

基本上,我想监控一块内存,特定于一条记录或任何定义指向tag_inner_PROPVARIANT的变量。

【问题讨论】:

    标签: delphi debugging memory cpu monitor


    【解决方案1】:

    我不确定这是您要查找的内容,因为您的问题文本非常不清楚。但是,此答案基于您的问题的标题。


    您可以使用数据 breakpoint。与到达特定代码行时停止的常规断点不同,数据断点在内存中的值更改时停止。然后,您可以检查调用堆栈以找出导致更改的原因。

    • 通过调试器启动您的应用。
    • 在断点窗口中:单击“添加断点”旁边的向下箭头

    • 从菜单中选择“运行 > 添加断点 > 数据断点”。

    提示:虽然您可以使用变量/字段设置断点,但您可能会发现更容易找出要监视的特定地址并使用它来设置断点。这允许您处理对象的字段对于类的每个实例都重复的事实。

    【讨论】:

    • @Aid 您为帮助您解决您的问题的任何人提供了基本为零的有用信息。例如。你说“Delphi 一直给你一个错误”,但懒得说什么错误。我们甚至不知道它是运行时错误还是编译时错误。您正在尝试阅读一些信息,但提供 zero 示例代码。突然在你谈论的问题进行到一半tag_inner_PROPVARIANT。设身处地为我们着想,假装你根本没有看过你的代码。 tag_inner_PROPVARIANT 有什么相关性?您的问题没有清楚。
    • 我明白了。 tag_inner_PROPVARIANT 被引用。我将它链接到 MSDN 文章。它是如何相关的? GetValue() 需要将其输入到其参数列表中。我想我会明白这一点,因为它实际上并不是关于那个特定的记录或变量,而是问题所在的内存数据监控,因此标题为Monitor certain part of memory for changes, such as data of record。它也可能是字符串类型变量或整数类型变量。无论如何,我找到了一种方法来监控我感兴趣的变量。
    • 调试时,我按照您的建议添加了一个断点(我已经知道了,但仍然提供了很好的信息),并且在将 tag_inner_PROPVARIANT 输入到 GetValue() 之前,我放置了该断点,并且然后我在GetValue() 之后添加了另一个断点,然后我运行调试。我注意到左下角有一个小窗口代替了Objecy Inspector,它被称为Local Variables - Thread XXXXXX,在那里我可以监控我的tag_inner_PROPVARIANT并查看两个断点处的变化。
    • @Aid 不,你不明白克雷格在告诉你什么。克雷格告诉你另一种断点,数据断点。这些可用于在修改内存地址范围时使调试器中断。这样一来,您就不需要确定所有可能修改变量的位置(其中一些可能超出您的控制范围)。
    • 哦,我会调查的。
    【解决方案2】:

    如果你要监控一个变量,你可以在变量被操作之前添加一个断点,在变量被操作之后添加一个。

    然后运行调试并在左下角的Local Variables - XXXXXX 窗口中观察变量。 (运行时替换Object Inspector)

    【讨论】:

    • 我不明白这怎么能成为提问者所提问题的答案。我认为不需要告诉我们如何在调试器中设置断点和使用局部变量窗口。文档就是这样做的。如果您想问一些非常基本的问题,例如“我如何在调试时观察值”,那么就这样做。
    • 好吧,您可能不需要被告知,但有些人是编程新手,他们可能会觉得这些信息很有用。想想没有经验的人,大卫。
    • 确实如此。但不在这个特定问题的答案中。请随时询问“如何在调试时观察值”。
    • 我不能。它表示我已达到此帐户可以提出的问题数量。
    猜你喜欢
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    相关资源
    最近更新 更多