addr2line

삽질 기록 2018. 12. 22. 12:58 Posted by 아는 개발자

개발하다보면 에러가 발생한 물리 주소만 떡하니 알려주고 바이너리의 어떤 함수에서 죽었는지는 알려주지 않는 로그 메시지를 보게될 때가 있다. 이런 경우에는 addr2line 커맨드를 이용해 어떤 파일 몇번째 라인에서 에러가 발생했는지 확인 할 수 있다.


아래의 예제 코드를 통해 addr2line의 사용법을 익혀보자.


void func(void) {
}

int main() {
    printf("func:addr %p\n", func);
}


위 코드를 gcc에 -g 옵션을 주고 컴파일해서 실행해보면 특정 숫자 값을 출력하게 되는데 이 값은 func함수의 물리 주소 값이다. 이 값을 addr2line에 넣어서 실행해보면 func함수가 어떤 파일 몇번째 라인에 불렸는지 확인 할 수 있다. -e 옵션은 디버깅할 바이너리를 지정하는 값이고 마지막에 붙은 숫자는 주소 값이다.