Tsan

ThreadSanitizer는 google에서 clang과 gcc로 만들어졌습니다. Tsan은 코드 내에 race condition을 찾는 것을 도와줍니다.
#include <pthread.h>
#include <stdio.h>

int Global;

void *Thread1(void *x) {
    Global++;
    return NULL;
}

int main() {
    pthread_t t[2];
    pthread_create(&t[0], NULL, Thread1, NULL);
    Global = 100;
    pthread_join(t[0], NULL);
}
// compile with gcc -fsanitize=thread -pie -fPIC -ltsan -g simple_race.c


위 코드에서는 Global에 대해 race condition이 존재하는 것을 알 수 있습니다. main thread와 pthread_create로 만들어진 thread가 동시에 같은 값을 바꾸려고 하고 있습니다.


위와 같은 코드를 작성후 옵션을 위에 주석처리된 대로 적어 컴파일을 후 실행하면, Tsan이 이 race condition을 찾을 수 있는 지 알 수 있습니다.


$ ./a.out
==================
WARNING: ThreadSanitizer: data race (pid=28888)
  Read of size 4 at 0x7f73ed91c078 by thread T1:
    #0 Thread1 /home/zmick2/simple_race.c:7 (exe+0x000000000a50)
    #1  :0 (libtsan.so.0+0x00000001b459)

  Previous write of size 4 at 0x7f73ed91c078 by main thread:
    #0 main /home/zmick2/simple_race.c:14 (exe+0x000000000ac8)

  Thread T1 (tid=28889, running) created by main thread at:
    #0  :0 (libtsan.so.0+0x00000001f6ab)
    #1 main /home/zmick2/simple_race.c:13 (exe+0x000000000ab8)

SUMMARY: ThreadSanitizer: data race /home/zmick2/simple_race.c:7 Thread1
==================
ThreadSanitizer: reported 1 warnings



만약 컴파일시 debug flag를 사용한다면 race condition이 발생하는 변수의 이름도 알 수 있습니다.

'Angrave System Programming > Learning C' 카테고리의 다른 글

Question/Exercises  (0) 2019.01.16
Debugging(4)  (0) 2019.01.09
Debugging(2)  (0) 2019.01.09
Debugging(1)  (0) 2019.01.09
Strings and Structs(2)  (0) 2019.01.09
Posted by 몰랑&봉봉
,