hash_add使系统崩溃

时间:2019-06-17 19:45:23

标签: c linux kernel hashtable

当我向哈希表中添加元素时,它会使系统内核崩溃,并且我无法找出原因。

我正在编写一些代码,以便在内核模式下进行一些网络数据包嗅探,并将统计信息存储在有关通过我的嗅探器的每个数据包流的结构中。

我的哈希表定义为:

DEFINE_HASHTABLE(flow_dictionary, 10);

,然后初始化为:

hash_init(flow_dictionary);

我的数据结构定义为

struct flow_action_head {
    unsigned int flowID;

    /* Mode of operations */
    SELECTION_MODE sampling_mode;
    SELECTION_MODE normalization_mode;

    /* Statistics */
    unsigned int numberPackets;
    unsigned int timeFirstPacket;
    unsigned int timeLastPacket;
    unsigned int packetsReceived;
    unsigned int packetsProcessed;

    /* Pointer to action details */
    nas_t* next;

    /* Required for linked hash list */
    struct hlist_node hash_list;

}; // __attribute__((packed));

在函数中,我这样做:

void map_add_flow(unsigned int flowID) {

    struct flow_action_head* fah;

    fah = (struct flow_action_head*) kzalloc(sizeof(struct flow_action_head), GFP_ATOMIC);

    fah->flowID = flowID;
    fah->sampling_mode = SMODE_COUNT_BASED;
    fah->normalization_mode = NMODE_TTL;
    fah->numberPackets = 1;
    fah->timeFirstPacket = 0;
    fah->timeLastPacket = 0;
    fah->packetsReceived = 0;
    fah->packetsProcessed = 0;
    fah->next = NULL;

    hash_add(flow_dictionary, &fah->hash_list, flowID);
}

一旦我击中hash_add,系统就会崩溃。

我希望它只是使用flow_dictionary作为键将记录添加到哈希表flowID中。我不明白为什么这会导致它崩溃。该结构似乎还可以,我可以读取/写入flow_action_head结构的每个值。

1 个答案:

答案 0 :(得分:0)

我不知道你的背景,所以我假设最少。

您熟悉kgdb吗?如果没有,您可能想自我介绍。

我经常看到报告“调用此函数时崩溃”;在调试器中浏览完之后,发现“当我调用时”的意思是+-几千个中断和数百万个操作码。您需要在hash_add()的返回值上设置一个断点。

如果您还不准备深入探讨kgdb,请执行以下操作:您可以在此调用之后从printk()开始;该消息的存在提供了重要的线索: 1.您实际上是否在hash_add返回之前崩溃了?如果您可以看到您的消息,那么您肯定是从插入处发回来的。 2.如果您将其恢复原状,则可以从调用中获得一个时间戳,可以将其与内核崩溃时的时间戳进行比较。

通常,与“我崩溃”相比,内核崩溃包含更多信息。有时,它会指出崩溃的位置,崩溃的原因,执行位置的堆栈跟踪。所有这些信息对于确定崩溃的根本原因很有用。

FWIW;查看您发布的代码,我看不到任何错误。我逐步浏览了哈希表,看来您正在使用它。我怀疑您应该看一下从该哈希列表中删除或查找内容的地方。祝你好运,狩猎愉快。