Odpowiedzi:
Możesz użyć strcmp:
break x:20 if strcmp(y, "hello") == 0
20to numer wiersza, xdowolna nazwa pliku i ydowolna zmienna.
No symbol "strcmp" in current context.
run, aby biblioteki dynamiczne zostały załadowane. Aby uzyskać źródło,
$_streqmetoda 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 configurationw 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")
$_streqdopasowuje 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 .
strncmpistrstrinne przydatne funkcje zapytań C.