2013-12-19 2 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_apply_filter를 호출하는 대신 루프 앞에 "trace_config (trace, TRACE_OPTION_FILTER, filter)"를 사용하는 것이 좋습니다. 그러면 libtrace가이를 최적화 할 수 있습니다. 예를 들어 bpf 필터를 커널에 추가하십시오.

관련 문제