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 |