ZZ Binutil 바 이 너 리 도구 모음 (addr2line)

1994 단어
Addr2line 을 사용 하여 함수 주 소 를 함수 이름 으로 해석 합 니 다.
Addr2line 도구 (표준 GNU Binutils 의 일부분) 는 명령 의 주소 와 실행 가능 한 이미 지 를 파일 이름, 함수 이름, 소스 코드 줄 수로 변환 할 수 있 는 도구 입 니 다.이런 기능 은 추적 주 소 를 더 의미 있 는 내용 으로 바 꾸 는 데 정말 좋다.
이 과정 이 어떻게 일 하 는 지 알 고 싶다 면 우 리 는 간단 한 상호작용 의 예 를 시험 해 볼 수 있다.(저 는 셸 에서 직접 작업 을 합 니 다. 목록 4 와 같이 이 과정 을 가장 간단하게 보 여 주 는 방법 이기 때 문 입 니 다.) 이 예제 C 파일 (test. c) 은 cat 간단 한 응용 프로그램 을 통 해 이 루어 집 니 다. (즉, 표준 출력 텍스트 를 파일 로 재 설정 하 는 것 입 니 다)그리고 gcc 를 사용 하여 이 파일 을 컴 파일 하면 특별한 옵션 을 전달 합 니 다.우선 -Wl 옵션 을 사용 하여 링크 기 에 이미지 파일 을 만 들 고 -g 옵션 을 사용 하여) 컴 파일 러 에 디 버 깅 기 호 를 생 성 하 라 고 알려 야 합 니 다.최종 실행 가능 한 파일 test 생 성.새로운 실행 가능 한 프로그램 을 가 져 오 면 이미지 파일 에서 주 소 를 찾 을 수 있 는 grep 도 구 를 사용 할 수 있 습 니 다.이 주소 와 Addr2line 도 구 를 사용 하면 함수 명 main, 원본 파일 (/home/mtj/test/test. c) 과 원본 파일 에 있 는 줄 번호 (4) 를 판단 할 수 있 습 니 다.
Addr2line 도 구 를 호출 할 때 실행 가능 한 이미 지 를 지정 하려 면 main 옵션 을 사용 하 십시오.-e 옵션 을 사용 하면 도구 출력 함수 이름 을 알려 줍 니 다.
목록 4. addr2line 의 대화 형 예

$ cat >> test.c

#include <stdio.h>

int main()

{

printf("Hello World
");

return 0;

}

$ gcc -Wl,-Map=test.map -g -o test test.c

$ grep main test.map

0x08048258 __libc_start_main@@GLIBC_2.0

0x08048258 main

$ addr2line 0x08048258 -e test -f

main

/home/mtj/test/test.c:4

$

查看U-BOOT的信息:

U-BOOT本身在编译以后会有一个System.map文件,这里我们就不用再次生成。就直接:

yoyoili@yoyoili-laptop:~/source/system_study/u-boot-1.3.4$ grep board_init System.map

33f92e8c T board_init

yoyoili@yoyoili-laptop:~/source/system_study/u-boot-1.3.4$ arm-softfloat-linux-gnu-addr2line 33f92e8c -e u-boot -f

board_init

/home/yoyoili/source/system_study/u-boot-1.3.4/board/fs2410/fs2410.c:69

就可以看到我们的board_init函数的地址和所在的文件。

좋은 웹페이지 즐겨찾기