检测结构成员变化的有效方法?

时间:2016-03-15 16:35:04

标签: c structure

这似乎应该很简单,但我找不到与它有多大关系。我的结构有不同的字段用于存储有关程序操作的数据。我想记录这些数据,以便以后分析。尝试在程序操作过程中不断记录数据会占用大量资源。因此,我只想在数据发生变化时调用日志功能。如果有一种有效的方法来检查结构成员是否已更新,我会很高兴。目前我正在玩3种结构(旧的,当前的和新的)的shell游戏,以便检测数据何时发生变化。提前致谢。

3 个答案:

答案 0 :(得分:0)

您可以在日志功能中跟踪结构及其哈希值。

让你有一个哈希函数:

int hash(void* ptr, size_t size);

让你有一个从指针到结构到结构的散列的映射,如:

/* Stores hash value for ptr*/
void ptr2hash_update_hash(void* ptr, int hash);
/* Remove ptr from mapping */
void ptr2hash_remove(void* ptr);
/* Returns 0 if ptr was not stored, or stored has otherwise*/
int ptr2hash_get_hash(void* ptr);

然后你可以检查你的对象是否在这样的日志调用之间被更改了:

int new_hash = hash(ptr, sizeof(TheStruct));
int old_hash = ptr2hash_get_hash(ptr);
if (old_hash == new_hash)
    return;

ptr2hash_update_hash(ptr, new_hash);
/* Then do the logging */

执行ptr时,不要忘记从映射中移除free(ptr):)

这是simple hash table implementation,你需要它来实现ptr2hash映射。 简单的哈希函数是here

答案 1 :(得分:0)

如果您在Linux(x86或x86_64)上运行,那么另一种可能的方法如下:

使用modify_ldt system call在本地描述符表中为不可写段安装段描述符。将您的数据放在此段中(或安装段以使您的数据结构在其中)。

写入权限后,您的流程将收到def same(self, another): is_same = False if self == None and another == None: is_same = True if self is not None and another is not None: is_same = ((self._root == rs._root) and identical(self._left, rs._left) and identical(self._right, rs._right)) return is_another (细分错误)。使用SIGSEGV安装处理程序以捕获分段错误。在该处理程序中,首先检查故障是否发生在先前设置的段(si_addr member of the siginfo_t)内,如果是,则准备记录通知。现在,更改段描述符,使段变为可写并从信号处理程序返回。

现在将执行写入,但您需要一种方法将段更改为不可写,并实际检查写入的内容以及数据是否实际更改。

一种可能的方法是将自己(或“延迟”过程然后再回到主过程)发送另一个信号(例如sigaction),并在此信号的处理程序中执行上述操作。 / p>

  • 这是便携式吗?
  • 这可靠吗?
  • 这很容易实现吗?

因此,如果可以,我真的希望你这样做,请使用已建议的界面。

答案 2 :(得分:0)

您可以尝试的最简单的方法是,您可以保留两个structure pointers。一旦您收到新的更新值,您可以将new structure pointerold structure pointer进行比较,如果有任何差异,您可以检测到它,然后您可以更新为old structure pointer所以您可以在将来检测更新值的进一步变化。

typedef struct testStruct
{
    int x;
    float y;
}TESTSTRUCT;

TESTSTRUCT* getUpdatedValue()
{
    TESTSTRUCT *ptr;
    ptr->x = 5;
    ptr->y = 6;
    //You can put your code to update the value.
    return ptr;
}

void updateTheChange(TESTSTRUCT* oldObj,TESTSTRUCT* newObj)
{
    cout << "Change Detected\n";
    oldObj = newObj;
}

int main()
{
    TESTSTRUCT *oldObj = NULL;
    TESTSTRUCT *newObj = NULL;

    newObj = getUpdatedValue();

    //each time a value is updated compae with the old structure
    if(newObj == oldObj)
    {
        cout << "Same" << endl;
    }
    else
    {
        updateTheChange(oldObj,newObj);
    }

    return 0;
}

我不确定,它会给你你的确切答案。

希望这有助于。