menonton hanya istirahat pada menulis, jam tangan Anda istirahat membaca, dan menonton membiarkan Anda istirahat membaca / menulis.
Anda dapat mengatur titik pantau baca di lokasi memori:
gdb$ rwatch *0xfeedface
Hardware read watchpoint 2: *0xfeedface
tetapi satu batasan berlaku untuk perintah rwatch dan awatch; Anda tidak dapat menggunakan variabel gdb dalam ekspresi:
gdb$ rwatch $ebx+0xec1a04f
Expression cannot be implemented with read/access watchpoint.
Jadi, Anda harus mengembangkannya sendiri:
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 ()
Sunting: Oh, dan omong-omong. Anda memerlukan dukungan perangkat keras atau perangkat lunak . Perangkat lunak jelas jauh lebih lambat. Untuk mengetahui apakah OS Anda mendukung titik pandang perangkat keras, Anda dapat melihat pengaturan lingkungan titik penggunaan dapat-hw .
gdb$ show can-use-hw-watchpoints
Debugger's willingness to use watchpoint hardware is 1.
watch -location mTextFormatted
.print &variable
watch
perintah. Sementara itu, ini adalah pertanyaan pertama yang muncul di pikiran setelah membaca di atas. Berapa banyak byte yangrwatch *0xfeedface
akan ditonton?rwatch *(int *)0xfeedface
dan akan menontonsizeof(int)
byte: sourceware.org/gdb/onlinedocs/gdb/Set-Watchpoints. htmlApa yang Anda cari disebut titik jaga .
Pemakaian
(gdb) watch foo
: perhatikan nilai variabelfoo
(gdb) watch *(int*)0x12345678
: perhatikan nilai yang ditunjukkan oleh alamat , dicantumkan ke jenis apa pun yang Anda inginkan(gdb) watch a*b + c/d
: saksikan ekspresi kompleks yang sewenang-wenang , valid dalam bahasa ibu programArloji ada tiga macam:
Anda dapat memilih yang lebih sesuai dengan kebutuhan Anda.
Untuk informasi lebih lanjut, lihat ini .
sumber
Dengan asumsi jawaban pertama mengacu pada sintaks mirip C
(char *)(0x135700 +0xec1a04f)
maka jawaban yang harus dilakukanrwatch *0x135700+0xec1a04f
salah. Sintaks yang benar adalahrwatch *(0x135700+0xec1a04f)
.Kurangnya
()
ada di sana menyebabkan saya sangat sakit mencoba menggunakan watchpoints sendiri.sumber
Saya baru saja mencoba yang berikut ini:
Jadi sepertinya mungkin, tetapi Anda tampaknya memerlukan dukungan perangkat keras.
sumber
Gunakan arloji untuk melihat kapan suatu variabel ditulis, lihat kapan itu dibaca dan baca ketika itu dibaca / ditulis dari / ke, seperti disebutkan di atas. Namun, harap dicatat bahwa untuk menggunakan perintah ini, Anda harus merusak program, dan variabel harus berada dalam cakupan ketika Anda telah merusak program:
sumber