Odpowiedzi:
Możesz użyć strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
to numer wiersza, x
dowolna nazwa pliku i y
dowolna zmienna.
No symbol "strcmp" in current context.
run
, aby biblioteki dynamiczne zostały załadowane. Aby uzyskać źródło,
$_streq
metoda z @tlwhitec jest lepsza.
break x if ((int)strcmp(y, "hello")) == 0
W niektórych implementacjach gdb może nie znać zwracanego typu strcmp. Oznacza to, że musiałbyś rzucić, w przeciwnym razie zawsze zostanie ocenione jako prawda!
Od GDB 7.5 możesz używać tych natywnych funkcji wygodnych :
$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)
Wydaje się to znacznie mniej problematyczne niż konieczność wykonywania „obcego” strcmp()
na stosie procesu za każdym razem, gdy trafiony jest punkt przerwania. Jest to szczególnie prawdziwe w przypadku debugowania procesów wielowątkowych.
Zauważ, że twój GDB musi być skompilowany z obsługą Pythona, co nie jest problemem w obecnych dystrybucjach Linuksa. Aby mieć pewność, możesz to sprawdzić, uruchamiając
show configuration
w GDB i wyszukując--with-python
. Ten mały oneliner też się sprawdza:$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python' --with-python=/usr (relocatable)
W przypadku wersji demonstracyjnej użycie byłoby
break <where> if $_streq(x, "hello")
lub, jeśli punkt przerwania już istnieje i chcesz po prostu dodać do niego warunek
condition <breakpoint number> $_streq(x, "hello")
$_streq
dopasowuje tylko cały ciąg, więc jeśli chcesz czegoś bardziej przebiegłego, powinieneś użyć $_regex
, który obsługuje składnię wyrażeń regularnych Pythona .
strncmp
istrstr
inne przydatne funkcje zapytań C.