Yanıtlar:
Şunları kullanabilirsiniz strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
satır numarasıdır, x
herhangi bir dosya adı y
olabilir ve herhangi bir değişken olabilir.
No symbol "strcmp" in current context.
run
verebileceksiniz: dinamik kütüphanelerin yüklenmesi için buna ihtiyacınız var. Kaynak için google it ve şunu bulun: stackoverflow.com/questions/10000335/… :-)
$_streq
@tlwhitec yöntemi daha iyidir.
break x if ((int)strcmp(y, "hello")) == 0
Bazı uygulamalarda gdb, strcmp'nin dönüş türünü bilmiyor olabilir. Bu, atmanız gerekeceği anlamına gelir, aksi takdirde her zaman doğru olarak değerlendirilir!
GDB 7.5'ten bu yana bu yerel Rahatlık İşlevlerini kullanabilirsiniz :
$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)
strcmp()
Kesme noktası her vurulduğunda işlem yığını üzerinde bir "yabancı" yürütmek zorunda kalmaktan daha az sorunlu görünüyor . Bu özellikle çok iş parçacıklı işlemlerde hata ayıklama için geçerlidir.
GDB'nizin mevcut linux dağıtımlarıyla ilgili bir sorun olmayan Python desteği ile derlenmesi gerektiğini unutmayın. Emin olmak için,
show configuration
GDB'nin içinde çalışıp arayarak kontrol edebilirsiniz--with-python
. Bu küçük oneliner de hile yapar:$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python' --with-python=/usr (relocatable)
Demo durumunuz için kullanım
break <where> if $_streq(x, "hello")
veya kesme noktanız zaten mevcutsa ve sadece koşulu ona eklemek istiyorsanız
condition <breakpoint number> $_streq(x, "hello")
$_streq
yalnızca tüm dizeyle eşleşir, bu nedenle daha kurnaz bir şey istiyorsanız $_regex
, Python düzenli ifade sözdizimini destekleyen kullanmalısınız .
strncmp
vestrstr
diğer yararlı C sorgu fonksiyonlarıdır.