Как получить членов класса в LLDB через указатель на экземпляр класса

0

Теперь я использую LLDB (довольно новый пользователь) в MAC. У меня есть следующий пример кода:

 MessageCacheItem::pointer msg = getValue(objId);
 bool outdated = (NULL != msg.get()) && (msgSentTime > msg->m_msgSentTime);
 return outdated;

MessageCacheItem - это класс с частным членом m_msgSentTime. Внутри LLDB я использовал следующую команду:

fr v msg->m_msgSentTime

Это дало мне следующую ошибку:

Ошибка: "msg" не является указателем и → использовался для попытки доступа к "m_msgSentTime". Возможно, вы имели в виду "badge.m_msgSentTime"?

Хотя msg является shared_pointer для экземпляра класса.

Мой вопрос: как проверить членов класса с указателем на экземпляр класса в LLDB?

  • 0
    вы пробовали msg.get()->m_msgSentTime - у меня такое чувство, что lldb и другие отладчики обычно не понимают operator-> и подобные конструкции.
  • 0
    @MatsPetersson Я пытался, это не работает.
Показать ещё 3 комментария
Теги:
lldb

2 ответа

1

frame variable (fr v) имеет очень простую информацию о синтаксисе языка C, встроенную в нее. Он работает с переменными, локальными для фрейма стека (или глобальными переменными, если вы используете target variable) - он знает, как разыменовать указатель (*, ->), и он знает, как смотреть на подэлемент структуры (.) И Я думаю, что это может сделать индексацию массива ([1]). Но об этом. Вы определенно не можете выполнять вызов функции, например, fr v msg.get()->m_msgSentTime (или fr v msg->m_msgSentTime что эквивалентно). Вы не можете поместить любые выражения типа в выражение переменной с frame variable.

Возможно, вы смогли сделать это с помощью чего-то вроде fr v msg.__ptr_->m_msgSentTime или что-то еще, в зависимости от реализации вашего общего объекта указателя.

1

Вместо того, чтобы использовать

fr v msg->m_msgSentTime

используйте вместо этого следующее:

p msg->msgSentTime

Тем не менее, я еще не нашел, где разница между этими двумя командами (на всякий случай кто-то может увидеть ту же проблему, я ответил на свой вопрос). Если любой гуру LLDB знает разницу, вас приветствует добавить еще.

  • 0
    р является сокращением для «выражения». Когда вы говорите «p <что-то>», вы действуете так, как если бы этот код был частью вашей исходной программы, вызывая clang для его компиляции и выполнения от вашего имени. В некоторых простых случаях LLDB на самом деле будет интерпретировать IR LLVM вместо JITting в вашем подчиненном процессе и выполнении, но вы поймете это.
  • 0
    Фреймовая переменная не включает ни код оценки, ни лязг. Он умеет показывать локальные переменные и имеет очень простой синтаксический анализатор для синтаксисов вида ab, a-> b и некоторых других, но он не будет оценивать выражение и полагаться исключительно на понимание LLDB ваших типов для построения результирующее значение.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню