使用libtrace在C代码中出现段错误

时间:2013-12-19 20:42:39

标签: c

我使用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]

1 个答案:

答案 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来优化它过滤到内核。