programing

gdb를 사용하여 주소를 회선으로 변환

padding 2023. 7. 7. 18:40
반응형

gdb를 사용하여 주소를 회선으로 변환

다음과 같은 제거된 응용 프로그램에 의해 생성된 스택 추적이 있습니다.

 *** Check failure stack trace: ***
    @     0x7f0e442d392d  (unknown)
    @     0x7f0e442d7b1f  (unknown)
    @     0x7f0e442d7067  (unknown)
    @     0x7f0e442d801d  (unknown)
    @     0x7f0e457c55e6  (unknown)
    @     0x7f0e457c5696  (unknown)
    @           0x4e8765  (unknown)
    @           0x4a8b43  (unknown)
    @     0x7f0e43197ced  (unknown)
    @           0x4a6889  (unknown)

그리고 실행 파일과 모든 라이브러리(디버깅 정보와 함께 컴파일됨)의 비스트립 버전이 있습니다.그런데 주소를 어떻게 파일과 라인 번호로 변환할 수 있습니까?

제가 시도한 것은 다음과 같습니다.

gdb
set solib-absolute-prefix /path/to/non-stripped/edition/of/root/filesystem/sysroot/
file /path/to/non-stripped/edition/of/root/filesystem/sysroot/usr/bin/my-buggy-app
info line *0x7f0e457c5696

파일 명령을 입력하면 파일에서 기호만 로드되고 사용되는 모든 라이브러리는 로드되지 않습니다.이것을 할 수 있는 방법이 있습니까?

"info line" 명령어는 다음과 같습니다.

주소 0x7f0e442d801d에 사용할 수 있는 라인 번호 정보가 없습니다.

주소가 공유 라이브러리 중 하나에 있기 때문이라고 생각합니다. 하지만 그 중 어느 라이브러리에 있는지 어떻게 알 수 있을까요?

OP에 따라 주소에서 코드의 소스 라인을 찾는 GDB의 명령은 다음과 같습니다.

info line *0x10045740

편집: 특정 조건에서 작동하지 않는 "info symbol 0x10045740"을 교체했습니다(Thomasa88 감사합니다).

그런데 주소를 어떻게 파일과 라인 번호로 변환할 수 있습니까?

기본 실행 파일의 경우(다음과 같은 주소)0x4e8765) 다음 작업을 수행합니다.

addr2line -e /path/to/non-stripped/.../my-buggy-app \
    0x4a6889 0x4a8b43 0x4e8765

사실, 당신은 당신이 빼기를 원할지도 모릅니다.5(일반적인 길이)CALL위의 모든 주소로부터).

공유 라이브러리의 주소는 라이브러리의 로드 주소를 알아야 합니다.

응용 프로그램에서 생성된 경우core파일, 그 다음(gdb) info shared라이브러리가 로드된 위치를 알려줍니다.

코어 파일을 가져오지 않았고 응용 프로그램이 필요한 매핑을 인쇄하지 않은 경우

  • 당신은 그 정보를 인쇄할 수 있도록 애플리케이션을 수정해야 합니다(스택 추적이 없으면 대부분 쓸모가 없습니다).
  • 여전히 추측할 수 있습니다. 실행 파일의 코드를 보십시오.0x4e8760이여야 합니다.CALL어떤 기능에 대한 지시.이제 해당 기능이 어떤 라이브러리에 있는지 확인하고 라이브러리에서 주소를 찾습니다(를 통해).nm만약 당신이 운이 좋다면, 그 주소는 근처에 있습니다.0xNc56NN이제 모든 라이브러리의 로드 주소를 추측할 수 있습니다.0x7f0e457NNNNNN다음 기간 동안 반복합니다.0x7f0e457c55e1그리고 당신은 도서관의 로드 주소를 찾을 수 있습니다.0x7f0e442dNNNN.

언급URL : https://stackoverflow.com/questions/8545931/using-gdb-to-convert-addresses-to-lines

반응형