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


244

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

답변:


286

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.

7
C ++ 메소드의 멤버를보고 싶다면이 변형이 매우 유용하다는 것을 알았습니다 watch -location mTextFormatted.
Ivan Vučica

변수의 주소가 없으면 어떻게합니까? 그 이름 만 사용할 수 있습니까?
Raffi Khatchadourian

5
GDB가 address-of 연산자로 변수의 주소를 인쇄하도록 할 수 있습니다. print &variable
Loduwijk

1
이 답변은 명령에 의해 감시되는 메모리 위치 의 크기 에 대해서는 아무 것도 말하지 않습니다 watch. 한편 이것은 위의 내용을 읽은 후 떠오르는 질문입니다. rwatch *0xfeedface실제로 몇 바이트 를 볼 수 있습니까?
AnT

8
@AnT, 나는 그것이 단일 바이트를 보겠다고 가정하고 있는데, 그것은 경우처럼 보이지만 당신은 그것을 특정 유형으로 캐스트 할 수 있으며 바이트 rwatch *(int *)0xfeedface를 볼 수 있습니다 sizeof(int): sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints. html
asksol

28

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

용법

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

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

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

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

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

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

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


5
기존 답변이 나에게 그렇게 간단하지 않아서 다른 답변을 썼습니다 .
Paolo M

25

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

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


9

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

 $ 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

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


플랫폼이 하드웨어 감시 점을 지원하지 않는 경우 gdb는 소프트웨어 감시 점으로 폴백해야합니다.
Tod

2

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.