2009-05-11 11 views
2

나는 그/모든 사람이 두 가지 관련 프로그램 (예 : 클래스의 과제)의 실행을 비교하여 그 유사성을 알 수있는 도구가 있는지 궁금합니다. 예를 들어 함수의 이름을 비교하지 않고 syscall을 사용하는 방법을들 수 있습니다. C 문자열이 (아래 예 참조)으로 인쇄 된 경우 하나의 바보 같은 경우가 하나의 사례 인 경우 하나의 개별 프로그램이 테스트됩니다. 매우 유사한 프로그램 실행 찾기

printf("%s",str) 

또는

for (i=0;i<len;i++) printf("%c",str[i]); 

내가 넣어 많은이에 생각 haven't,하지만 난이 (어쩌면 OProfile은) 그 strace를 /은 ltrace를 상상으로

좋은 출발점이 될 것입니다. 특히 이것은 UNIX C/C++ 프로그램 용입니다.

감사합니다.

+0

왜 조립품 번호 등을 확인하지 않는 것이 좋을까요? – ojblass

답변

1

초기 생각은 ltrace 및 strace를 사용하여 호출을 기록한 다음 로그에서 diff를 사용하는 것입니다. 이것은 분명히 시스템이 호출하는 라이브러리만을 커버 할 것입니다. 보다 세부적인 로깅이 필요하면 oprofile이 도움이 될 수 있습니다.

소스 코드에 액세스 할 수있는 경우 프로파일 링 정보로 컴파일 한 다음 실행 한 후 gcov 출력을 구문 분석하여 코드를 구성 할 수 있습니다. 코드가 외부 데이터/상태에 따라 다른 경로를 사용하지 않으면 순수 정적 소스 코드 분석으로 충분할 수 있습니다.

1

두 프로그램의 소스 코드에 액세스 할 수있는 경우 함수 그래프를 작성할 수 있습니다 (각 함수는 노드이고 A가 B()를 호출하면 A에서 B까지의 모서리가 있음). 그래프 유사성 메트릭을 계산하십시오. 이렇게하면 이름을 바꾸고 재구성하여 만든 소스 코드 복사본을 잡을 수 있습니다.

1

나는 valgrind를 사용하여 이런 종류의 일을 할 수 있다고 생각합니다.

세밀한 버전 (그리고 프로그램 소스에 대한 액세스 및 비교 대상으로 정확히 무엇을 할 것인가에 따라) kprobes를 사용하는 것이 좋습니다.

커널 동적 프로브 (Kprobes)는 커널 모듈이 프로브를 삽입하고 해당 프로브 핸들러를 등록하기위한 경량 인터페이스를 제공합니다. 프로브는 기본 소스를 수정할 필요없이 (커널 공간) 모듈을 실행하는 데 동적으로 주입되는 자동 중단 점입니다. 프로브는 시스템 중단을 최소화해야하는 임시 서비스 지원으로 사용하기위한 것입니다. 인터랙티브 디버거를 사용하지 않는 생산 환경에서는 특히 그렇습니다. Kprobes는 또한 테스트 및 개발 환경에서 상당한 유용성을 가지고 있습니다. 테스트하는 동안 프로빙 모듈에 의해 오류가 주입되거나 시뮬레이트 될 수 있습니다. 개발 중에 디버깅 코드 (예 : printk)는 테스트중인 모듈에 다시 컴파일 할 필요없이 쉽게 삽입 될 수 있습니다.

관련 문제