답변:
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.
print &variable
watch
. 한편 이것은 위의 내용을 읽은 후 떠오르는 질문입니다. rwatch *0xfeedface
실제로 몇 바이트 를 볼 수 있습니까?
rwatch *(int *)0xfeedface
를 볼 수 있습니다 sizeof(int)
: sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints. html
찾고있는 것을 감시 점 이라고합니다 .
용법
(gdb) watch foo
: 변수 의 가치를보십시오 foo
(gdb) watch *(int*)0x12345678
: 주소가 가리키는 값을보고 원하는 유형으로 캐스트하십시오.
(gdb) watch a*b + c/d
: 프로그램의 모국어로 유효한 임의의 복잡한 표현을 봅니다.
주 시점은 세 가지 종류입니다.
필요에 따라 더 적합한 것을 선택할 수 있습니다.
방금 다음을 시도했습니다.
$ 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 명령에 대한 인수는 평가되는 표현식입니다. 이는 감시 점을 설정하려는 변수가 현재 범위 내에 있어야 함을 의미합니다. 따라서 비전 역 변수에 감시 점을 설정하려면 변수가 범위 내에있을 때 프로그램을 중지 할 중단 점을 설정해야합니다. 프로그램이 중단 된 후 감시 점을 설정합니다.
watch -location mTextFormatted
.