2013-12-19 50 views
0

我使用libtrace編寫了此代碼,但是出現了段錯誤。我把所有的代碼放在這裏作爲澄清。任何人都可以幫助我解決問題! 我也應該提到,代碼要抽樣一些特殊的數據包的平方根系數。使用libtrace編寫C代碼中的Seg錯誤

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下運行此命令並查看回溯和變量以查看發生了什麼。嘗試「gdb --args ./your-program foo.pcap」「運行」,然後當它崩潰「bt full」。我建議在你的循環之前使用「trace_config(trace,TRACE_OPTION_FILTER,filter)」,而不是在每個數據包上調用trace_apply_filter,因爲libtrace可以通過例如推動bpf過濾入內核。