当我向哈希表中添加元素时,它会使系统内核崩溃,并且我无法找出原因。
我正在编写一些代码,以便在内核模式下进行一些网络数据包嗅探,并将统计信息存储在有关通过我的嗅探器的每个数据包流的结构中。
我的哈希表定义为:
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
结构的每个值。
答案 0 :(得分:0)
我不知道你的背景,所以我假设最少。
您熟悉kgdb吗?如果没有,您可能想自我介绍。
我经常看到报告“调用此函数时崩溃”;在调试器中浏览完之后,发现“当我调用时”的意思是+-几千个中断和数百万个操作码。您需要在hash_add()的返回值上设置一个断点。
如果您还不准备深入探讨kgdb,请执行以下操作:您可以在此调用之后从printk()开始;该消息的存在提供了重要的线索: 1.您实际上是否在hash_add返回之前崩溃了?如果您可以看到您的消息,那么您肯定是从插入处发回来的。 2.如果您将其恢复原状,则可以从调用中获得一个时间戳,可以将其与内核崩溃时的时间戳进行比较。
通常,与“我崩溃”相比,内核崩溃包含更多信息。有时,它会指出崩溃的位置,崩溃的原因,执行位置的堆栈跟踪。所有这些信息对于确定崩溃的根本原因很有用。
FWIW;查看您发布的代码,我看不到任何错误。我逐步浏览了哈希表,看来您正在使用它。我怀疑您应该看一下从该哈希列表中删除或查找内容的地方。祝你好运,狩猎愉快。