任务是从一个跟踪器读取数据包并写入许多跟踪器。
我使用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
使用tracer数组的元素创建,启动和写入数据包都很好 当我在循环中销毁输出跟踪器时,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。
有人可以解释一下为什么会发生这种事情或者如何正确销毁它?
答案 0 :(得分:0)
我认为你的代码中有一个超出范围的访问权限
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]不是数组中的有效元素
答案 1 :(得分:0)
从您发布的代码中,看起来您正在使用相同的URI创建10个输出跟踪。所以,基本上,你已经创建了10个输出文件,所有文件都具有相同的文件名,这可能不是你想要的。
当需要销毁输出跟踪时,第一个destroy会关闭与您提供的名称匹配的文件,并将对该文件的引用设置为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已经包含一个名为tracesplit的工具,它接受输入源并根据某些标准(例如,数据包数量,输出文件大小,时间间隔)将数据包拆分为多个输出跟踪。这个工具可能已经做了你想要的而不必编写代码,或者至少在编写你自己的代码时它会作为一个很好的例子。