IT story

GDB에서 '메모리 액세스'에 중단 점을 설정할 수 있습니까?

hot-time 2020. 4. 18. 09:38
반응형

GDB에서 '메모리 액세스'에 중단 점을 설정할 수 있습니까?


gdb를 통해 응용 프로그램을 실행 중이며 특정 변수에 액세스하거나 변경할 때마다 중단 점을 설정하고 싶습니다. 이를위한 좋은 방법이 있습니까? 또한 C / C ++에서 변수를 모니터링하여 변경 여부를 확인할 수있는 다른 방법에 관심이 있습니다.


watch 는 쓰기 만하고 rwatch 는 읽기를 중단하고 awatch 는 읽기 / 쓰기를 중단 시킵니다 .

메모리 위치에서 읽기 감시 점을 설정할 수 있습니다.

gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface

그러나 rwatch 및 awatch 명령에는 한 가지 제한이 있습니다. 표현식에 gdb 변수를 사용할 수 없습니다 :

gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.

따라서 직접 확장해야합니다.

gdb$ print $ebx 
$13 = 0x135700
gdb$ rwatch *0x135700+0xec1a04f
Hardware read watchpoint 3: *0x135700 + 0xec1a04f
gdb$ c
Hardware read watchpoint 3: *0x135700 + 0xec1a04f

Value = 0xec34daf
0x9527d6e7 in objc_msgSend ()

편집 : 아, 그런데. 하드웨어 또는 소프트웨어 지원 이 필요합니다 . 소프트웨어 속도가 훨씬 느립니다. OS가 하드웨어 감시 점을 지원하는지 확인하려면 can-use-hw-watchpoints 환경 설정을 수 있습니다 .

gdb$ show can-use-hw-watchpoints
Debugger's willingness to use watchpoint hardware is 1.

찾고있는 것을 감시 점 이라고합니다 .

용법

(gdb) watch foo: 변수 의 가치를보십시오 foo

(gdb) watch *(int*)0x12345678: 주소가 가리키는 값을보고 원하는 유형으로 캐스트하십시오.

(gdb) watch a*b + c/d: 프로그램의 모국어로 유효한 임의의 복잡한 표현을 봅니다.

주 시점은 세 가지 종류입니다.

  • watch : 쓰기 가 발생 하면 gdb가 중단됩니다
  • rwatch : gdb는 읽기 가 발생 하면 중단 됩니다.
  • awatch : gdb가 두 경우 모두 중단됩니다

필요에 따라 더 적합한 것을 선택할 수 있습니다.

자세한 내용은 이것을 확인 하십시오 .


첫 번째 대답이 C와 같은 구문 (char *)(0x135700 +0xec1a04f)참조한다고 가정하면 할 대답 rwatch *0x135700+0xec1a04f이 잘못되었습니다. 올바른 구문은 rwatch *(0x135700+0xec1a04f)입니다.

의 부족으로 ()인해 워치 포인트를 직접 사용하려고 시도하는 데 많은 고통이 발생했습니다.


방금 다음을 시도했습니다.

 $ cat gdbtest.c
 int abc = 43;

 int main()
 {
   abc = 10;
 }
 $ gcc -g -o gdbtest gdbtest.c
 $ gdb gdbtest
 ...
 (gdb) watch abc
 Hardware watchpoint 1: abc
 (gdb) r
 Starting program: /home/mweerden/gdbtest 
 ...

 Old value = 43
 New value = 10
 main () at gdbtest.c:6
 6       }
 (gdb) quit

따라서 가능해 보이지만 일부 하드웨어 지원이 필요한 것 같습니다.


변수를 쓸 때는 watch를 사용하고 변수를 읽을 때는 rwatch를, 위에서 언급 한대로 변수를 읽거나 쓸 때는 awatch를 사용하십시오. 그러나이 명령을 사용하려면 프로그램을 중단해야하며 프로그램을 중단 한 경우 변수가 범위 내에 있어야합니다.

watch 명령을 사용하십시오. watch 명령에 대한 인수는 평가되는 표현식입니다. 이는 감시 점을 설정하려는 변수가 현재 범위 내에 있어야 함을 의미합니다. 따라서 비전 역 변수에 감시 점을 설정하려면 변수가 범위 내에있을 때 프로그램을 중지 할 중단 점을 설정해야합니다. 프로그램이 중단 된 후 감시 점을 설정합니다.

참고 URL : https://stackoverflow.com/questions/58851/can-i-set-a-breakpoint-on-memory-access-in-gdb

반응형