char* x
değeri "hello"
değerine eşit olan bir dize işaret ettiğinde gdb'nin x satırında kırılmasını istediğimi belirtebilir miyim? Evet ise nasıl?char * x değeri "merhaba" değerine eşit olan bir dizeye işaret ettiğinde gdb'de koşullu kesme noktası nasıl ayarlayabilirim?
cevap
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.
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. –
@ 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 :-) –
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!
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
demo durum içinshow configuration
'u çalıştırarak ve--with-python
'u arayarak kontrol edebilirsiniz. Bu küçük oneliner da hile yapar:$ 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.
Not: 'strncmp' ve' strstr' diğer yararlı C sorgu işlevleridir. –