2012-06-12 3 views
24

gdb에서 프로그램을 디버깅 중이며 메모리 영역 0x08049000에서 0x0804a000에 액세스 할 때 프로그램을 중단하고 싶습니다. 메모리 중단 점을 수동으로 설정하려고하면 gdb가 한 번에 두 개 이상의 위치를 ​​지원하지 않는 것 같습니다.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. 

이미 질문이 제기되었고 답변은 valgrind에서 가능할 수도 있습니다. 불행히도 대답은 valgrind 매뉴얼에 대한 예제 나 참조를 포함하지 않으므로 매우 enlightning이 아닙니다. How can gdb be used to watch for any changes in an entire region of memory?

So : 전체 메모리 영역을 어떻게 볼 수 있습니까?

+0

재미있는 사실 the Valgrind user manual on gdb integration를 참조 http://stackoverflow.com/questions/ 13410941/set-break-on-every-line-in-gdb/31658056 # 31658056 –

+0

x86은 최대 8 바이트의 작은 시계 범위를 지원합니다 : https://en.wikipedia.org/wiki/X86_debug_register –

답변

23

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

는 다음 ( target remote | vgdb)에 연결하기 위해 GDB를 사용하는 인수 --vgdb=full --vgdb-error=0 을 제공 Valgrind의 아래 프로그램을 시작

. 예를 들면 다음과 같습니다. 파워 원거리했다 중단 점 (?하지만 워치 포인트) : watch 또는 awatch 또는 rwatch rwatch (char[100]) *0x5180040

을 수행하여 메모리 범위 자세한 내용은

+2

'mprotect '를 치고 SIGSEV 핸들러를 악용하여 메모리 접근을 망가 뜨리는 날을 보았습니다. 그것은 완벽하게 작동합니다. 너는 내 하루를 구했다. 고맙습니다! – iblue

+0

예, +1도 있습니다. 나는이 같은 기능을 몇 달 동안 사냥 해왔다. – Crashworks

+0

따라서 valgrind에서 시작한 프로세스의 힙 주소는 어떻게 결정됩니까? 필자는 보통 */proc/[pid]/maps *를 통해이 작업을 수행합니다. 그러나이 valgrind 명령을 통해 Python을 시작하면 맵 파일에 ** [heap] **로 식별되는 항목이 없습니다. . –

10

메모리 주소가 변경되었을 때이를 감지하는 기능은 a hardware breakpoint이라고하며 실제로는 특정 주소에 액세스 할 때이를 감지하고 디버거 중단 인터럽트를 트리거하는 메모리 컨트롤러 내의 레지스터 인 —입니다. 불행하게도 the x86 architectureonly has four such registers 그리고 그 이유는 설정할 수있는 메모리 감시 중단 점의 수가 제한되어 있기 때문입니다.

그런 이유로 valgrind와 같은 것을 사용해야합니다. 전체 지역을 감시하려면 메모리 액세스 패턴을 시뮬레이트하는 소프트웨어를 사용해야합니다. 사실 valgrind가 실제로 전체 메모리 범위를 보는 것을 지원하는지는 모르겠다. 직접 패치해야 할 수도 있습니다. 중단 점을 던지려면 VALGRIND_MAKE_MEM_NOACCESS()를 수정 한 다음 프로그램을 계속 진행하십시오.

관련 문제