销毁libtrace_out_t*数组的问题

Problems with destroying an array of libtrace_out_t*

本文关键字:数组 问题 libtrace out 销毁      更新时间:2023-10-16

任务是从一个示踪剂读取数据包并写入许多。

我将libtrace_out_t **用于输出示踪剂。
初始化:

uint16_t size = 10;
libtrace_out_t** array = libtrace_out_t*[size];
for(uint16_t i = 0; i < size; ++i) {
   array[i] = trace_create_output(uri); // created OK
   trace_start_output(outTracers_[i]); // started OK
}
// writing packets

使用示踪剂数组的元素创建,启动和编写数据包都很好。
问题是由trace_destroy_output()引起的,当我在循环中销毁输出示踪剂时:

for(uint16_t i = 0; i < size; ++i)  
{  
  if(outTracers_[i])  
     trace_destroy_output(outTracers_[i]);  
}

在第一个迭代输出示踪剂上正在销毁罚款。
但是第二次,它在

中的分割故障时失败
pcap_close(pcap_t* p)

因为指针P具有值0x0。

有人可以解释我为什么会发生这种事情或如何正确销毁它?

从您发布的代码中,看起来您正在使用相同的URI创建10个输出轨迹。因此,从本质上讲,您已经创建了10个输出文件,所有文件都可能不是您想要的。

是时候销毁输出轨迹时,第一个销毁关闭了与您提供的名称匹配的文件,并将对该文件的引用设置为null。因为该引用现在为null,所以任何随后销毁该文件的尝试都会导致分段故障。

确保您为创建的每个新输出跟踪更改URI,并应解决问题。

示例:

/* I prefer pcapfile: over pcap: */
const char *base="pcapfile:output";
uint16_t size = 10;
libtrace_out_t* array[size];
for (uint16_t i = 0; i < size; ++i) {
    char myuri[1024];
    /* First output file will be called output-1.pcap
     * Second output file will be called output-2.pcap
     * And so on...
     */
    snprintf(myuri, 1023, "%s-%u.pcap", base, i);
    array[i] = trace_create_output(uri);
    /* TODO Check for errors here */
    if (trace_start_output(array[i])) {
        /* TODO Handle error case */
    }
}

另一个提示:libtrace已经包含了一个称为TracePlit的工具,该工具根据某些条件(例如数据包,输出文件的大小,时间间隔)将数据包分成多个输出跟踪。此工具可能已经在不需要编写代码的情况下完成了您想要的事情,或者至少在编写自己的代码时会做一个很好的例子。

我认为您在代码中有界限

中的范围访问
uint16_t size = 5; /// number of tracers
for(uint16_t i = 0; i != size; ++i)  
{  
  if(outTracers_[i])  
     trace_destroy_output(outTracers_[i]);  
}

转化为

for(uint16_t i = 0; i <= 5; ++i)  
{  
  ...
}

和Outtracers _ [5]不是您的数组中的有效元素