2013-12-19 3 views
0

Я пишу этот код с использованием libtrace, но у меня возникла ошибка сегментации. Я поместил весь мой код здесь для уточнения. кто-нибудь может помочь мне, где проблема! Я также должен упомянуть, что код хочет пробовать некоторые специальные пакеты базы квадратного коэффициента.Ошибка Seg в коде 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

Где объявляются какие-либо ваши переменные? – kbshimmyo

+0

в главном, но я не поставил его здесь – user3120628

+0

Попробуйте выполнить компиляцию с '-Wall -g' и запустив его через [Valgrind] (http://valgrind.org/docs/manual/quick-start.html). – kbshimmyo

ответ

0

libtrace требует вызвать trace_create() и trace_create_output(), прежде чем их можно использовать для чтения и записи пакетов. Вы могли бы сделать это в коде, который вы отклонили, но я не могу сказать.

Сравнение времени начала пакета с конкретным числом почти никогда не будет истинным, поэтому вы можете переполнить массив размеров. Я бы рекомендовал использовать> = blocktime.

Я бы предложил запустить это под gdb и посмотреть на backtrace и переменные, чтобы посмотреть, что происходит. попробуйте «gdb --args ./your-program foo.pcap» «запустить», затем, когда он сработает «bt full».

В качестве незначительных ничтожных точек: я бы рекомендовал использовать «trace_config (trace, TRACE_OPTION_FILTER, filter)» перед вашим циклом вместо вызова trace_apply_filter для каждого пакета, так как тогда libtrace может оптимизировать это, например, нажав bpf в ядре.

Смежные вопросы