QVariant внутри QMap не распознается в GDB

Я нахожусь в корпоративной среде (что означает, что априори нет возможности добавлять красивые принтеры или изменять программное обеспечение на любом уровне), используя GDB (gdbserver) для отладки приложения с использованием Qt на другом устройстве.

Во время отладки мне обычно нужно проверять значения структуры Qt, такой как QMap, которая имеет QString в качестве ключа.

Кажется, у меня есть такая карта:

QVariantMap map;

Теперь, во время отладки, это происходит:

(gdb) p dataMap.value()
Too few arguments in function call.
(gdb) p dataMap.value("first")
Cannot resolve method QVariantMap::value to any overloaded instance
(gdb) p dataMap.value("first", QVariant(""))
A syntax error in expression, near `(""))'.

Согласно документации QMap, как 2-й, так и 3-й опции должны работать.

Это довольно раздражает, так как я хотел бы иметь возможность проверять значения карты без изменения моего кода.

Мне кажется, что есть какое-то недопонимание между GDB и Qt.

Любая помощь будет оценена по достоинству.


ИЗМЕНИТЬ:

Как указал Mohammed, gdb не должны понимать преобразование из const char * в QString.

Однако это не имеет никакого значения, поскольку при использовании QString("") я получаю ту же ошибку, что и в третьей команде исходной части с QVariant("").

(gdb) p params.value(QString("deliveryLimit"))
A syntax error in expression, near `"deliveryLimit"))'

В данном случае это QHash, но это не должно быть важно, так как я ищу способ отлаживать контейнеры значений Qt в целом.


person jjimenezg93    schedule 20.02.2017    source источник
comment
Не поленитесь и проверьте эту страницу с некоторой информацией о различных способах печати QString в GDB: silmor.de /qtstuff.printqstring.php и используйте QVariant().toString() для печати QVariant как строки.   -  person mohabouje    schedule 20.02.2017
comment
Извините, @MohammedB.B. но я не понимаю, почему вы связываете это. В любом случае, если GDB не принимает const char * (QString (const char *)), как мне вставить ключ, который я хочу отлаживать? Спасибо   -  person jjimenezg93    schedule 20.02.2017
comment
Что интересно, все отлаживается с помощью Qt Creator, который использует gdb. Я предполагаю, что Qt Creator делает дополнительные трюки. Возможно, потребуется усилие, но стоит заставить его работать с удаленным GDB в случае отладки устройства.   -  person Alexander V    schedule 20.02.2017
comment
@AlexanderVX Я не сомневаюсь в этом, и это рассматривается, но должен быть способ добиться этого вручную, не так ли? Спасибо   -  person jjimenezg93    schedule 21.02.2017
comment
@ jjimenezg93 Qt предназначен для графического интерфейса, верно? И отлаживать GUI с помощью gdb из командной строки? Слишком громоздко для меня. Если нет отладчика IDE, то tat max logs   -  person Alexander V    schedule 21.02.2017
comment
@AlexanderVX да, это для графического интерфейса. Но в чем проблема просмотреть содержимое массива через командную строку? В частности, набор строк, которые можно преобразовать в const char *? В любом случае, это вопрос мнений. Если бы я мог, я бы определенно использовал VS   -  person jjimenezg93    schedule 21.02.2017


Ответы (1)


Прежде всего, давайте используем QVariantMap для QMap<QString, QVariant>.

Возможные проблемы: gdb не является компилятором, поэтому давайте избежим пользовательских преобразований типов. Функция, которая хочет QString, позволяет дать ей QString, а не const char*.

(gdb) p dataMap.value(QString("first"))

Чтобы избежать проблем в будущем, используйте в своей программе небольшую вспомогательную функцию, которая будет принимать const char* и возвращать QString&, что-то вроде:

QString& toQString(const char* s)
{
       return *(new QString(s));
}

Затем в gdb

gdb> p dataMap.value(toQString("domain"));

Быстрое решение, используйте QMap<const char*, QVariant>

person mohabouje    schedule 20.02.2017
comment
Извините, это был QVariantMap, но я изменил его здесь, потому что, поскольку это был typedef, я подумал, что его будет легче читать. В любом случае это не имеет значения. Я обновил вопрос с этим изменением и комментариями ко второй части вашего ответа. Спасибо - person jjimenezg93; 20.02.2017