Теперь я использую 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?
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
или что-то еще, в зависимости от реализации вашего общего объекта указателя.
Вместо того, чтобы использовать
fr v msg->m_msgSentTime
используйте вместо этого следующее:
p msg->msgSentTime
Тем не менее, я еще не нашел, где разница между этими двумя командами (на всякий случай кто-то может увидеть ту же проблему, я ответил на свой вопрос). Если любой гуру LLDB знает разницу, вас приветствует добавить еще.
msg.get()->m_msgSentTime
- у меня такое чувство, чтоlldb
и другие отладчики обычно не понимаютoperator->
и подобные конструкции.