강좌 & 팁
글 수 2,412
2016.01.12 13:46:58 (*.122.242.71)
38953
리눅스 커널에 보면 헤더 파일들에 디버깅 코드들이 많이 심어져 있습니다.
이러한 코드들이 헤더에 있기 때문에 버그가 발생했을때 해당하는 주소를 파악하기가 어렵죠
소스상에서 사용할때는 __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__ 으로는 누가 해당 매크로를 사용했는지 알수 없을테니까요.
특히나 수많은 드라이버에서 많은 빈도로 사용되는 매크로의 경우 좋은 해결책이 됩니다.