2014-02-07 2 views
0

스레드가 Pthread 뮤텍스/스핀 록과 동기화 된 경우 pthread_mutex_lock()pthread_mutex_unlock()에 대한 호출을 쉽게 바꿀 수 있습니다 (예 : LD_PRELOAD). 이는 로깅/디버깅에 매우 유용 할 수 있습니다.gcc의 기본 내장 함수를 래핑 할 수 있습니까?

원자가 내장 된 gcc와 비슷한 것을 수행 할 수 있습니까? 예 : __sync_fetch_and_add?

나는 우리에게 LD_PRELOAD을 줄 수 없을 것이라고 생각하지만, 아마도 다른 메커니즘이있을 것입니다.

+0

내장 함수는 직접 기계 명령어로 변환됩니다. 라이브러리 함수 호출이 아닙니다. –

+0

예, 알고 있습니다. 그러나 아마도 gcc는 이러한 함수를 감쌀 수있는 컴파일 플래그 나 다른 방법을 제공합니다. – danyhow

+0

'__sync' 내장 명령은 '유산'입니다. 보다 최근의 ['__atomic'] (http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html#g_t_005f_005fatomic-Builtins) 내장물을 고려해보십시오. –

답변

0

인텔의 PIN (User Guide)과 같은 계측 API를 사용하면 가능하다고 생각합니다. 예를 들어 INS_IsAtomicUpdate으로 원자 적 업데이트를 수행하는 모든 명령어를 계측하고 추가 제외 기준을 추가하여 __sync_fetch_and_add에 의해 생성 된 명령어를 경험적으로 찾을 수 있습니다.

또는, 각 __sync_fetch_and_add 전에 asm volatile 블록 NOP를 일련의 설치 수 명령 시퀀스에 대한 상세보고, 기기는 다음 머신 코드 (코드 될 수밖에 __sync_fetch_and_add 대해 생성).

+0

가능한 솔루션이지만, 항상 Pin 위에 응용 프로그램을 실행해야합니다. (나는 NOP 시퀀스 트릭을 좋아한다.) – danyhow

+0

난 당신이 응용 프로그램에 PIN에 대한 의존성을 주입 할 필요는 없다고 확신한다. 내 주요 관심사는 NOP 블록이 성능을 해칠 수 있으므로 디버그 빌드에만 넣을 수 있다는 것입니다. –

+0

예, NOP와 동일한 문제가 있습니다. Pin에 대한 제 관심사는 배포에서 디버깅 정보를 원한다면 Pin을 응용 프로그램과 함께 제공하여 거기에서 실행되도록해야한다는 것입니다. 따라서 gcc 옵션을 사용하면 응용 프로그램과 함께 래퍼를 컴파일 할 수 있습니다. 그 이상으로 나는 해결책을 좋아한다. – danyhow

관련 문제