gdb에 여러 개의 기호 파일을 로드하는 방법
는에서 여러 의 심볼 gdb
실행 파일 foo.out과 모듈 bar.so 을 로드하고 있습니다.저는 foo.symbol과 bar.symbol 두 개의 심볼 파일을 만들었습니다.두 파일을 모두 gdb에 로드하는 방법.
# gdb --core core
# (gdb)
# (gdb) symbol-file foo.symbol
두 번째 기호 파일을 로드하는 방법.아니면 모든 디렉터리 파일을 로드할 수 있는 방법이 있습니까?gdb
기호 파일을 포함하는 디렉터리를 설정하려면 다음과 같이 하십시오.
set debug-file-directory <directory>
및 사용
show debug-file-directory
기호 파일을 포함하는 디렉터리로 현재 설정된 항목을 표시합니다.
기호 파일의 이름(경로 없음)이 이진에서 디버그 링크의 관점에서 제공되는 경우, 기호 파일은 이 디렉토리에서 자동으로 읽힙니다.
하려면 사할수있기추면려가하호를 할 수 .add-symbol-file
.
(여기서 인용하는 순간 gdbonline docs는 사용할 수 없는 것 같습니다.)
add-filename-filename 주소
add-filename-file 파일 이름 주소 [ -readnow ] [ -filename ]
add-filename-section 파일 이름 -section 주소...
add-symbol-file 명령은 파일 파일 이름에서 추가 기호 테이블 정보를 읽습니다.파일 이름이 실행 중인 프로그램에 동적으로 로드된 경우 이 명령을 사용합니다. 주소는 파일이 로드된 메모리 주소여야 합니다. gdb는 이를 직접 확인할 수 없습니다.임의 개수의 '-section address' 쌍을 추가로 지정하여 해당 섹션에 대한 명시적인 섹션 이름과 기본 주소를 지정할 수 있습니다.모든 주소를 식으로 지정할 수 있습니다.
파일 파일 이름의 기호 테이블은 symbol-file 명령으로 원래 읽은 기호 테이블에 추가됩니다.add-symbol-file 명령을 여러 번 사용할 수 있습니다. 따라서 읽은 새 기호 데이터가 이전 기호에 계속 추가됩니다.이전 기호 데이터를 모두 삭제하려면 인수 없이 symbol-file 명령을 사용합니다.
파일 이름은 일반적으로 프로세스에 로드하기 위해 완전히 재배치된 공유 라이브러리 파일, 실행 파일 또는 다른 개체 파일이지만, 다음과 같은 경우 재배치 가능한 .o 파일에서 심볼 정보를 로드할 수도 있습니다.
- 파일의 심볼 정보는 해당 파일에 정의된 링커 심볼만 참조하고, 다른 객체 파일에 의해 정의된 심볼은 참조하지 않습니다.
- 파일의 기호 정보가 참조하는 모든 섹션은 파일에 나타나는 것처럼 실제로 하위 섹션에 로드되었습니다.
- 모든 섹션이 로드된 주소를 확인하고 add-session-file 명령에 제공할 수 있습니다.
Sun Chorus 및 VxWorks와 같은 일부 내장 운영 체제는 이미 실행 중인 프로그램에 재배치 가능한 파일을 로드할 수 있습니다. 이러한 시스템은 일반적으로 위의 요구 사항을 충족하기 쉽게 합니다.그러나 많은 기본 시스템이 요구 사항을 충족하기 어려운 복잡한 링크 절차(예: 섹션 팩터링 및 C++ 생성자 테이블 어셈블리에 대한 링크)를 사용합니다.일반적으로 add-symbol-file을 사용하여 재배치 가능한 객체 파일의 심볼 정보를 읽는 것이 재배치 가능한 객체 파일을 정상적인 방법으로 프로그램에 연결하는 것과 동일한 효과를 가질 것이라고 가정할 수 없습니다.
사용 후 를 눌러도 add-message-file이 반복되지 않습니다.
당신은 할 수 .
-mapped' and
가 filenamereadnow' symbol-file에 합니다.
는 가기호로수있다에 될 수 .gdb
디버그 세션:
add-symbol-file filename address
매 수address
는 의주니다입의 입니다..text
부분.이 주소는 다음을 사용하여 검색할 수 있습니다.
readelf -WS path/to/file.elf | grep .text | awk '{ print "0x"$5 }'
은 다에서 수있다니에서 될 수 있습니다.gdb
다음항을에써로으에 다음 ~/.gdbinit
:
define add-symbol-file-auto
# Parse .text address to temp file
shell echo set \$text_address=$(readelf -WS $arg0 | grep .text | awk '{ print "0x"$5 }') >/tmp/temp_gdb_text_address.txt
# Source .text address
source /tmp/temp_gdb_text_address.txt
# Clean tempfile
shell rm -f /tmp/temp_gdb_text_address.txt
# Load symbol table
add-symbol-file $arg0 $text_address
end
정의 에 의수함정의후위후▁afteradd-symbol-file-auto
추가 기호 로드를 사용할 수 있습니다.
(gdb) add-symbol-file-auto path/to/bootloader.elf
add symbol table from file "path/to/bootloader.elf" at
.text_addr = 0x8010400
(gdb) add-symbol-file-auto path/to/application.elf
add symbol table from file "path/to/application.elf" at
.text_addr = 0x8000000
(gdb) break main
Breakpoint 1 at 0x8006cb0: main. (2 locations)
(gdb) info break
Num Type Disp Enb Address What
1 breakpoint keep y <MULTIPLE>
1.1 y 0x08006cb0 in main() at ./source/main.cpp:114
1.2 y 0x080106a6 in main() at ./main.cpp:10
(gdb)
, 알의답변코과멘외에트그, 의 주소입니다..text
부분.다음을 사용하여 찾을 수 있습니다.readelf
에 여에예있다습니의 .readelf
이진 파일에 사용 파일 이름이 로드된 주소가 없습니다 [GDB].
add-symbol-file-auto
자코의 대답은 외부 파일에 쓰는 것에 의존합니다.이로 인해 파일을 읽거나 쓸 수 없는 경우 문제가 발생할 수 있습니다.다음은 Python에 정의된 GDB 명령을 사용하여 동일한 기능을 제공하는 구현입니다.에 추가합니다..gdbinit
:
python
# Note: Replace "readelf" with path to binary if it is not in your PATH.
READELF_BINARY = 'readelf'
class AddSymbolFileAuto (gdb.Command):
"""Load symbols from FILE, assuming FILE has been dynamically loaded (auto-address).
Usage: add-symbol-file-auto FILE [-readnow | -readnever]
The necessary starting address of the file's text is resolved by 'readelf'."""
def __init__(self):
super(AddSymbolFileAuto, self).__init__("add-symbol-file-auto", gdb.COMMAND_FILES)
def invoke(self, solibpath, from_tty):
from os import path
self.dont_repeat()
if os.path.exists(solibpath) == False:
print ("{0}: No such file or directory." .format(solibpath))
return
offset = self.get_text_offset(solibpath)
gdb_cmd = "add-symbol-file %s %s" % (solibpath, offset)
gdb.execute(gdb_cmd, from_tty)
def get_text_offset(self, solibpath):
import subprocess
elfres = subprocess.check_output([READELF_BINARY, "-WS", solibpath])
for line in elfres.splitlines():
if "] .text " in line:
return "0x" + line.split()[4]
return "" # TODO: Raise error when offset is not found?
def complete(self, text, word):
return gdb.COMPLETE_FILENAME
AddSymbolFileAuto()
end
사용 예:
add-symbol-file-auto foo.symbol
기호를 로 로드하는 것만으로 중단점을 설정할 수 있지만 실제로 중단점을 트리거하는 것과 같은 유용한 작업을 자동으로 수행할 수는 없습니다.사용(또는info shared
기호가 실제로 디버깅 대상과 관련이 있는지 확인합니다(모두가 아닌 특정 결과를 표시하는 패턴을 선택적으로 사용).다음과 같이 표시되어야 합니다.
(gdb) gdb-symbol-file-auto path/to/library.symbols
(gdb) info shared symbol-file
From To Syms Read Shared Object Library
0x0000abc0 0x0000def0 Yes path/to/library
로드된 기호를 사용하지 않을 경우 다음이 표시됩니다.
From To Syms Read Shared Object Library
0x0000abc0 0x0000def0 Yes (*) path/to/library
(*): Shared library is missing debugging information.
GDB가 라이브러리를 전혀 로드할 수 없는 경우(예: GDB에 버그가 있는 경우) 다음이 표시됩니다.
From To Syms Read Shared Object Library
0x0000abc0 0x0000def0 No path/to/library
기호를 올바른 위치에 수동으로 로드하려고 시도하는 대신 제거된 실행 파일에 기호를 다시 병합하는 것이 더 편리하다는 것을 알게 되었습니다.eu-unstrip
기호가 이미 존재하는 상태에서 충돌을 재현합니다.
이 접근 방식은 설정 시 사용되는 경로 확인 메커니즘(디버그 링크 및 빌드 ID)에 필요한 명명 체계와 일치하는 기호 파일에 의존하지 않습니다.debug-file-directory
.
파일을 (다른 에서 언급한 것처럼) readelf를 가 공유 기호 을 제대로 하지 않는했습니다.add-symbol-file
명령이 사용됩니다.
대신 명령에 표시된 '시작' 주소를 사용해야 했습니다.info sharedlibrary
/info shared <libname>
:
(gdb) info shared libcore
From To Syms Read Shared Object Library
0x0f24caa0 0x0f41c280 Yes (*) /lib/libcore.so
이 주소를 사용하고 심볼 파일을 로드한 후 라인 번호를 제대로 알 수 있었습니다.
(gdb) add-symbol-file libcore.so.debug 0x0f24caa0
add symbol table from file "libcore.so.debug" at
.text_addr = 0xf24caa0
(y or n) y
Reading symbols from libcore.so.debug...
이 페이지를 읽고 이 솔루션을 찾았습니다.CMake 및 GDB를 사용하여 디버그 기호 테이블 생성 및 사용
add-symbol-file filename address
add-symbol-file filename address [ -readnow ] [ -mapped ]
add-symbol-file filename -ssection address ...
http://www.delorie.com/gnu/docs/gdb/gdb_125.html 을 참조하십시오.
언급URL : https://stackoverflow.com/questions/20380204/how-to-load-multiple-symbol-files-in-gdb
'programing' 카테고리의 다른 글
Python 튜플을 문자열로 변환 (0) | 2023.07.20 |
---|---|
SQL Server가 저장 프로시저에서 varchar를 자동으로 잘라냅니다. (0) | 2023.07.15 |
긴 텍스트 문자열에서 모든 줄 바꿈 제거 (0) | 2023.07.15 |
데이터 프레임의 열을 열 이름별로 정렬 (0) | 2023.07.15 |
깃풀 미리보기 방법? (0) | 2023.07.15 |