c - hash_add 使系统崩溃

标签 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 结构的每个值。

最佳答案

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

你熟悉 kgdb 吗?如果没有,您可能需要 self 介绍。

我经常看到报告“当我调用这个函数时它崩溃了”;在调试器中浏览后,事实证明“当我调用时”意味着 +- 几千个中断和数百万个操作码。您需要在 hash_add() 返回时设置断点。

如果您还没有准备好深入研究 kgdb;您可以在此调用后从 printk() 开始;该消息的存在提供了重要线索: 1. 在 hash_add 返回之前你真的崩溃了吗?如果您能看到您的消息,那么您肯定已经从插入中返回了。 2. 如果成功返回,您将获得调用的时间戳,您可以将其与内核崩溃时的时间戳进行比较。

通常内核崩溃时会提供比“我崩溃了”更多的信息。有时它会说它崩溃的地方,崩溃的原因,它正在执行的堆栈跟踪。所有这些信息都有助于确定崩溃的根本原因。

FWIW;查看您发布的代码,我看不出有什么问题。我逐步检查了哈希值,看来您使用它还不错。我怀疑您应该查看从该哈希列表中删除或查找内容的位置。祝你好运,狩猎愉快。

关于c - hash_add 使系统崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56637950/

相关文章:

linux - 在 BASH 中以特定格式列出多个文件

build - 如何构建freebsd内核?

java - 在 macOS Catalina 上打开 PhpStorm 后崩溃

c - 第一个示例由于编译器错误而无法编译

c - 类型转换为不同的编译器提供不同的结果

json - 如何在linux中用带变量的字典替换json中的数组字典

linux - 如何以非 root 身份从自定义 webmin 模块执行命令

c - 如何从 Windows 内核模式驱动程序设置键盘指示灯?

c - 什么时候在 C 中使用 %d 和 %f?

c - 在 C 中实现函数列表 + 在它们之间切换的更好方法?