Linux에서 addr2line 명령을 사용하는 방법
Unix에서 addr2line 명령을 사용하려고 하는데 매번 ?와 같은 출력이 나옵니다.:0. 명령어는 다음과 같습니다.addr2line -e a.out 0x4005BDC이 주소는 이 a.out 실행 파일을 실행하면서 취득했습니다.valgrind메모리 누설을 검출하는 툴입니다.소스 코드도 컴파일했습니다.-g선택.
Virtual Address(VA; 가상 주소)가 아닌 addr2line 오프셋을 지정해야 합니다.주소 공간 랜덤화가 해제되어 있으면 완전한 VA를 사용할 수 있지만 대부분의 최신 OS에서는 주소 공간이 새로운 프로세스에 대해 랜덤화됩니다.
VA를 지정하면0x4005BDC프로세스 또는 라이브러리의 기본 주소를 메모리 내에서 찾습니다.이것을 실시하려면 ,/proc/<PID>/maps파일화 됩니다.관심의 라인은text권한으로 식별할 수 있는 프로세스 세그먼트r-xp프로그램 또는 라이브러리의 이름을 입력합니다.
기본 VA는0x0x4005000그러면 제공된 VA와 기본 VA의 차이를 알 수 있습니다.0xbdc그런 다음 2행 추가에 입력합니다.
addr2line -e a.out -j .text 0xbdc
회선 번호를 알 수 있는지 확인해 보세요.
를 추가해 보겠습니다.-f옵션에서 함수 이름을 표시합니다.
addr2line -f -e a.out 0x4005BDC
addr2line 대신 gdb를 사용하여 메모리 주소를 검사할 수도 있습니다.gdb에 실행 파일을 로드하고 주소에 저장된 기호의 이름을 인쇄합니다.16 기호표 검토
(gdb) info symbol 0x4005BDC
그게 바로 네가 쓰는 방법이야.다만, 사용하고 있는 주소가 소스코드에 직접 대응하고 있지 않을 가능성이 있습니다.
예를 들어 다음과 같습니다.
$ cat t.c
#include <stdio.h>
int main()
{
printf("hello\n");
return 0;
}
$ gcc -g t.c
$ addr2line -e a.out 0x400534
/tmp/t.c:3
$ addr2line -e a.out 0x400550
??:0
0x400534의 주소입니다.main저 같은 경우에는요. 0x400408에서의 유효한 기능 주소이기도 합니다.a.out단, 디버깅 정보가 없는 GCC에 의해 생성/ Import된 코드입니다.(이 경우,__libc_csu_init. 실행 파일의 레이아웃을 참조할 수 있습니다.readelf -a your_exe.)
다른 때addr2line디버깅 정보가 없는 라이브러리를 포함하는 경우 오류가 발생합니다.
언급URL : https://stackoverflow.com/questions/7648642/how-to-use-the-addr2line-command-in-linux
'programing' 카테고리의 다른 글
| Vuex가 기존 양식 데이터를 상태별로 로드하여 편집 (0) | 2022.08.27 |
|---|---|
| Vuejs 프로젝트 빌드가 서버에서 작동하지 않음 (0) | 2022.08.27 |
| 앱을 렌더링할 때 firestore에서 컬렉션을 가져와 vuex 상태로 설정하는 방법은 무엇입니까? (0) | 2022.08.27 |
| 부호 없는 인덱스를 사용하여 역방향 'for' 루프를 수행하는 가장 좋은 방법은 무엇입니까? (0) | 2022.08.27 |
| 정적 Constatic vs #syslog (0) | 2022.08.27 |