2010-11-15 22 views

cevap

153

Sen strcmp kullanabilirsiniz:

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

20 hat numarasıdır, x herhangi bir dosya adı olabilir ve y herhangi değişken olabilir.

+6

Not: Programı zaten çalıştırıyor olmalısınız, böylece GDB stdlib dosyasını görecektir. Aksi takdirde: "Geçerli bağlamda" sembol "strcmp" yoktur. –

+0

@ naive231 tarafından "bkz" demek, işlevleri görebilmeniz için kaynaklara değil, bunlara bağlanabilirsiniz: bunun için 'run' tuşuna basmanız gerekir, böylece dinamik kütüphaneler yüklenir. Kaynak için, google ve bulmak: http://stackoverflow.com/questions/10000335/how-to-use-debug-version-of-libc :-) –

39
break x if ((int)strcmp(y, "hello")) == 0 

Bazı uygulamalarda gdb, strcmp dönüş türünü bilmiyor olabilir. Bu demek oluyor ki, sen bunu yapmak zorunda kalacaksın, aksi takdirde her zaman doğruyu değerlendirecektir!

10

Since GDB 7.5 bu kullanışlı Convenience Functions kullanabilirsiniz:

$_memeq(buf1, buf2, length)` 
$_streq(str1, str2) 
$_strlen(str) 
$_regex(str, regex) 

süreci üzerinde strcmp() bir "yabancı" yürütme zorunda göre oldukça az sorunlu görünüyor kesme isabet her zaman yığın.

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, GDB içinde show configuration'u çalıştırarak ve --with-python'u arayarak kontrol edebilirsiniz. Bu küçük oneliner da hile yapar:

demo durum için
$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python' 
      --with-python=/usr (relocatable) 

, kullanım

break <where> if $_streq(x, "hello") 
olacağını

ya da kesme noktası zaten var ve sadece eklemek istiyorsanız buna koşul

condition <breakpoint number> $_streq(x, "hello") 

$_streq sadece bütün str maçları ing, bu yüzden daha kurnaz bir şey istiyorsanız, Python regular expression syntax'u destekleyen $_regex'u kullanmalısınız.