2017-01-01 1 views
1

addr2line은 주소를 파일 이름과 줄 번호로 변환합니다. 나는 아직 초보자 디버깅, 그리고 addr2line에 대한 몇 가지 질문이 있습니다. 이 도구는 (그것을 얻을 수있는 곳!)에서 소스 코드 파일을 찾을 수있는 방법을addr2line은 소스 파일과 코드 행을 어떻게 찾을 수 있습니까?

  1. 입니다 특정 .so를 (이진) 파일을 디버깅하는 경우, 소스는 무엇을 존재하지 않는 경우?

  2. 2 진수의 주소와 해당 행의 번호 사이의 관계는 무엇입니까? 그래서 addr2line은 이러한 종류의 매핑을 수행 할 수 있습니까? 일반적으로

답변

3

addr2lineELF 실행 또는 디버그 정보를 공유 라이브러리에 가장 잘 작동합니다. 그 디버그 정보는 pass -g (또는 -g2 등 ...)에서 GCC으로 컴파일러에 의해 방출됩니다. 특히 소스 코드 위치 (소스 파일 이름, 행 번호, 열 번호)와 함수, 변수 이름, call stack 프레임 구성 등 사이의 매핑을 제공합니다. 디버그 정보는 오늘 DWARF 형식입니다 (또한 gdb debugger, libbacktrace library 등 등). 디버그 정보에는 소스 파일 경로 (소스 파일 자체가 아님)가 있습니다.

실제로, 당신은 (그리고 종종한다)도 -O2 같은 optimization 플래그 GCC-g (또는 -g2) 디버깅 옵션을 전달할 수 있습니다. 이 경우 디버그 정보는 약간 정확하지는 않지만 실제로 유용합니다. 경우에 따라 스택 프레임이 사라질 수 있습니다 (인라인 함수 호출, 테일 호출 최적화 등).

strip(1) 유틸리티를 사용하여 일부 ELF executable에서 디버그 정보 (및 기타 기호 테이블 등)를 제거 할 수 있습니다.

관련 문제