GDB условная точка останова на произвольных типах
Можно ли установить условную точку останова в GDB, где выражение условия содержит объекты произвольных типов классов?
Мне нужно установить точку останова внутри функции, где условие будет проверять, равна ли строковая переменная-член объекта "foo". Итак, что-то вроде:
condition 1 myObject->myStringVar == "foo"
Но это не работает. Разрешает ли GDB только условные контрольные точки на примитивах и типах char*? Можно ли как-нибудь установить условную точку останова на не примитивных типах?
2 ответа
Можно ли как-нибудь установить условную точку останова на не примитивных типах?
Да, один из способов сделать это - преобразовать не примитивный тип в примитивный, в вашем случае char*
и использовать strcmp
сравнить строки.
condition 1 strcmp(myObject->myStringVar.c_str(),"foo") == 0
Ответ на заданный вами вопрос - да... в общем случае он работает для произвольных классов и функций и функций-членов класса. Вы не застряли с тестированием примитивных типов. Перегрузки членов класса, например operator==
, должно сработать.
Но Стандартная Библиотека довольно сумасшедшая. Могу поспорить, что проблема с этим делом связана с operator==
для std:: string - глобальная шаблонная перегрузка оператора:
http://www.cplusplus.com/reference/string/operators/
Так что декларации похожи на:
template<class charT, class traits, class Allocator>
bool operator==(const basic_string<charT,traits,Allocator>& rhs,
const charT* lhs );
У меня часто бывают проблемы с GDB... и я не удивлюсь, если бы не знал, что с этим делать!
Обратите внимание, что в дополнение к тому, что сказал @ks1322, вы можете оставаться в области C++ и более просто использовать std:: string:: compare ():
condition 1 myObject->myStringVar.compare("foo") == 0