我使用libtrace编写此代码,但是我遇到了分段错误。我把我的所有代码都放在这里以便澄清。任何人都可以帮我解决问题! 我还应该提一下,代码想要对方形系数的一些特殊数据包进行采样。
int main(int argc,char **argv)
{
while(trace_read_packet(trace,packet)> 0 ){
if (filter && !trace_apply_filter(filter,packet))
continue;
if (packet->type < TRACE_RT_DATA_SIMPLE)
/* Ignore RT messages */
continue;
numpackets ++;
if (flag == true)
{
first =trace_get_seconds(packet);
flag = false;
}
sizes[i] = trace_get_capture_length(packet);
i++;
randnumber = (double)rand() / (double)RAND_MAX;
if(randnumber <= probability)
{
//trace_dump_packet(packet);
trace_write_packet(output, packet);
sampledpackets++;
}
next = trace_get_seconds(packet);
if (double_t(next - first)== blocktime)
{
scv = var(sizes, i);
scv = a_scv * scv + scv_error;
m = a_m * m + m_error;
n = 1 - (n/2);
probability = (ltqnorm(n)*e*scv) / m;
i =0;
flag = true;
}
}
printf("\n");
printf("number of packets is : %llu\n",numpackets);
printf("number of sampled packet: %llu\n",sampledpackets);
if (trace_is_err(trace)) {
trace_perror(trace, "trace_read_packet");
}
trace_destroy(trace);
trace_destroy_output(output);
}
return 0;
}
另外,这是我的记忆输出:
7fff18b1b000-7fff18b3c000 rw-p 00000000 00:00 0 [stack]
7fff18bfe000-7fff18c00000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
答案 0 :(得分:0)
libtrace要求您先调用trace_create()和trace_create_output(),然后才能使用它们来读取和写入数据包。您可能会在您省略的代码中执行此操作,但我无法分辨。
将数据包的结束开始时间与特定数字进行比较几乎不会成立,因此您可能会溢出size数组。我建议使用&gt; = blocktime。
我建议在gdb下运行它并查看回溯和变量以查看发生了什么。尝试“gdb --args ./your-program foo.pcap”“run”然后崩溃“bt full”。
作为次要的小点:我建议在循环之前使用“trace_config(trace,TRACE_OPTION_FILTER,filter)”,而不是在每个数据包上调用trace_apply_filter,因为libtrace然后可以通过例如推送bpf来优化它过滤到内核。