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
Другие вопросы по тегам