itsource

gdb의 메모리 범위를 보십니까?

mycopycode 2023. 10. 19. 22:18
반응형

gdb의 메모리 범위를 보십니까?

gdb 프로그램 디버깅 중인데 메모리 영역 0x08049000~0x0804a000 접속 시 프로그램이 중지되기를 원합니다.메모리 중단점을 수동으로 설정하려고 하면 gdb가 한 번에 두 개 이상의 위치를 지원하지 않는 것 같습니다.

(gdb) awatch *0x08049000
Hardware access (read/write) watchpoint 1: *0x08049000
(gdb) awatch *0x08049001
Hardware access (read/write) watchpoint 2: *0x08049001
(gdb) awatch *0x08049002
Hardware access (read/write) watchpoint 3: *0x08049002
(gdb) run
Starting program: /home/iblue/git/some-code/some-executable
Warning:
Could not insert hardware watchpoint 3.
Could not insert hardware breakpoints:
You may have requested too many hardware breakpoints/watchpoints.

이것이 어디서 질문을 받았고 답이 나왔는지, 발그린드로 이것을 하는 것이 가능할지에 대해서는 이미 의문이 있습니다.유감스럽게도 이 답변에는 발그라인드 설명서에 대한 예시나 참고 사항이 포함되어 있지 않아 그다지 계몽적이지 못했습니다.gdb를 사용하여 전체 메모리 영역의 변화를 확인할 수 있습니까?

그래서: 어떻게 하면 전체 기억 영역을 볼 수 있을까요?

GDB 7.4를 Valgrind 3.7.0과 함께 사용하면 무제한의 "에뮬레이트된" 하드웨어 워치포인트가 있습니다.

Valgrind에서 프로그램을 시작하고 인수를 제시합니다.--vgdb=full --vgdb-error=0GDB를 사용하여 연결합니다(target remote | vgdb). 그러면 예를 들 수 있습니다.watch아니면awatch아니면rwatch하는 것에 의한 기억 범위rwatch (char[100]) *0x5180040

자세한 내용은 gdb 통합에 대한 Valgrind 사용자 설명서 참조

메모리 주소가 변경된 경우를 감지하는 기능을 하드웨어 중단점이라고 하며, 실제로는 특정 주소에 액세스할 때를 감지하고 디버거 중단 인터럽트를 트리거하는 메모리 컨트롤러 내부의 레지스터입니다.안타깝게도 x86 아키텍처에는 이러한 레지스터가 4개밖에 없기 때문에 설정할 수 있는 메모리 워치 중단점의 수가 제한됩니다.

그렇기 때문에 valgrind와 같은 것을 사용해야 합니다. 전체 지역을 시청하려면 메모리 액세스 패턴을 시뮬레이션하는 소프트웨어를 사용해야 합니다.valgrind가 실제로 전체 메모리 범위를 시청할 수 있는지는 모르겠습니다.직접 패치를 붙여야 할 수도 있습니다.VALGRIND_MAKE_MEM_NOACCESS()를 수정하여 중단점을 던지지만 프로그램을 계속 진행할 수 있습니다.

저는 최근 gdb 자체가 지금 다양한 주소를 볼 수 있다는 것을 확인했습니다. 그러면 다른 답변들이 제시한 것처럼 valgrind가 필수가 아닙니다. 테스트 env:

  • GNU gdb (Ubuntu 12.1-0ubuntu1~22.04) 12.1
  • 11세대 인텔(R) 코어(TM) i7-11800H @ 2.30GHz

다음 명령을 사용합니다.

watch *(char [100]*)&gbuf

그리고 주소 범위를 보기 시작합니다.[gbuf, gbuf + 100)

언급URL : https://stackoverflow.com/questions/11004374/watch-a-memory-range-in-gdb

반응형