Pin 은 intel이 개발한 개발용 플랫폼이다.
이것은 어플리케이션이 구동될때, instruction 레벨에서 세세히 보면서 다양하게 어플리케이션을 씹고 뜯고 맛볼 수 있다. 개발자는 pintool이라는 분석프로그램을 짜서, 특정 instruction이 처리되기전, 또는 후에 원하는 코드를 집어 넣을수도 있고, instruction들의 operand를 불러와서 자체적으로 처리할 수도 있다.
pin tool의 메커니즘을 간단하게 설명하자면, 분석할 어플리케이션을 pin용 가상머신위에 돌린다.
그러면서 개발자가 짠 분석프로그램(pintool)에 맞춰서 어플리케이션의 intstruction들에 따라 분석프로그램이 넣은 트리거들이 반응해서 분석프로그램이 돌아가게 된다.
Pin에서 제공하는 Instrumentation API들이 어떤 Instruction들을 트리깅해서 가지고 올건지 이런게 있는데, 그 목록은
https://software.intel.com/sites/landingpage/pintool/docs/98547/Pin/html/index.html
여기서 확인할 수 있으며, 한번 들어가서 둘러보면 알 수 있다시피, 엄청나게 많다.
나도 원하는 것만 짜느라 다보지 못했지만, 파악했던 기능들을 간단하게 나열해보면,
INS_MemoryOperandIsRead 같은 걸 이용해서 지금 구동되는 inst가 memory read(store) 명령어인지 캐치할 수 있고, 이외에도 branch나 prefetch instruction들을 캐치하여 특정 동작을 넣을 수 있다.
심지어 pthread나 omp로 thread가 생성되는것을 캐치하고, 각 thread별로 생성되는 instruction들을 각각 따로 캐치할 수 있다(대신 가상머신에 돌리는 것이기 때문에 multi-thread로 돌리고, 각 thread들이 OS가 부여한 tid들 다 따로 가지고 있어도 하나의 가상머신 위에서 돌기 때문에 단일 코어에서 동작한다).
이 방대한 API들 중 내가 원하는 동작을 바로 찾기는 어렵고, pin을 다운 받으면 pin/source/tools/ 에 다양한 pintool 예시들이 존재한다. 이들을 그대로 쓰거나, 들어가서 얘네들이 사용하는 API를 참고하면서 만드는 것을 추천한다.
참고로 처음 개발할때 pintool을 helloworld같은 프로젝트는 pin/source/tools/MyPinTool 이다. 이것은 application이 돌면서 구동되는 총 instruction을 세는 프로그램이며, tools/ManualExamples의 inscount와 비슷하다.
이 챕터는 총 세개의 글로 작성할 예정이고, 첫글은 개요(현재 글)
두번째에는 예시인 MyPinTool을 통한 pintool 뜯어보기,
세번째에는 본인이 짯던 PinTool을 설명하고자 한다.
댓글