Char * x değeri “merhaba” ya eşit olan bir dizeyi gösterdiğinde gdb'de koşullu bir kesme noktasını nasıl ayarlarım?


Yanıtlar:


198

Şunları kullanabilirsiniz strcmp:

break x:20 if strcmp(y, "hello") == 0

20satır numarasıdır, xherhangi bir dosya adı yolabilir ve herhangi bir değişken olabilir.


9
Not: GDB'nin stdlib'i görmesi için programı zaten çalıştırıyor olmalısınız. Aksi takdirde:No symbol "strcmp" in current context.
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

1
@CiroSantilli g 事件 法轮功 包 卓 轩: stdlib'i görmek için gdb nasıl yapılandırılır?
naive231

@ naive231 by "see" Fonksiyonları görmek istedim, böylece kaynaklara değil, onlara zarar runverebileceksiniz: 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/… :-)
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

1
Bu yöntemin yan etkileri olabilir. $_streq@tlwhitec yöntemi daha iyidir.
rools

55
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!


46

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 configurationGDB'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")

$_streqyalnı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 .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.