리눅스 커널에 보면 헤더 파일들에 디버깅 코드들이 많이 심어져 있습니다.

이러한 코드들이 헤더에 있기 때문에 버그가 발생했을때 해당하는 주소를 파악하기가 어렵죠


소스상에서 사용할때는 __LINE__, __FUNCTION__ 등이 있지만 

런타임에서 발생하는 동적 주소들에 대한 디버깅을 할때 실행 주소가 필요할때가 있습니다.


_THIS_IP_  와  __RET_IP_ 두개의 매크로 정의는 아래와 같습니다.


"include/linux/kernel.h"

#define _RET_IP_                (unsigned long)__builtin_return_address(0)

#define _THIS_IP_  ({ __label__ __here; __here: (unsigned long)&&__here; })


눈치챈 분들이 계시겠지만 두번째 현재의 실행 명렁주소를 알기 위해서 label 을 생성하고 

해당 주소의 명령어 실행 주소를 표시해 줍니다


첫번째 __RET_IP_ 는 리눅스에서는 gcc 확장 명령인 __builtin_return_address(0) 을 이용해서

복귀할 주소를 표시해줍니다.  쉽게 말하면 처음 누가 불렀느냐이죠.

__LINE__ 으로는 누가 해당 매크로를 사용했는지 알수 없을테니까요.

특히나 수많은 드라이버에서 많은 빈도로 사용되는 매크로의 경우 좋은 해결책이 됩니다.