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
'IT story' 카테고리의 다른 글
"범위 기반 for 루프"에서 작동하도록 사용자 정의 유형을 만드는 방법은 무엇입니까? (0) | 2020.04.18 |
---|---|
리턴 유형이없는 Java 메소드는 리턴 명령문없이 컴파일 (0) | 2020.04.18 |
CPython에서 GIL (Global Interpreter Lock)이란 무엇입니까? (0) | 2020.04.18 |
IIS7 gzip 사용 (0) | 2020.04.18 |
포트 465와 587의 차이점은 무엇입니까? (0) | 2020.04.18 |