Как вызвать конструктор в gdb для pretty-printers

При отладке с помощью GDB я хотел бы установить для вспомогательной переменной новое созданное значение.

Я программирование с использованием фреймворка Qt, поэтому я хотел бы создать QString, но это не имеет отношения к вопросу, так как я хотел бы знать, как это сделать с любым классом.

Я попробовал

(gdb) set $str = 'QString::QString("abc")'
No symbol "QString::QString("abc")" in current context.

(gdb) set $str = QString::QString("abc")
Cannot resolve method QString::QString to any overloaded instance

(gdb) set $str = QString("abc")
A syntax error in expression, near `("abc")'.

, затем я попытался использовать отключил разрешение перегрузки , что привело к следующему:

set $str = QString::QString("abc")
non-unique member `QString' requires type instantiation

set $str = 'QString::QString(const char*)'("abc")
Too few arguments in function call.

Итак, я предположил, что необходим указатель this:

(gdb) set $str = 'QString::QString(const char*)'(malloc(sizeof(QString)), "abc")
(gdb) p $str
$8 = void

Хорошо, конструкторы возвращают void, это означает, что мне нужно где-то сохранить возвращаемое значение malloc:

(gdb) set $pointer = malloc(sizeof(QString))
(gdb) p $pointer
$9 = 6304560
(gdb) p/x $pointer
$10 = 0x603330
(gdb) set $str = 'QString::QString(const char*)'($pointer, "abc")
(gdb) p $str
$11 = void
(gdb) p $pointer
$12 = 6304560
(gdb) p *((QString*)$pointer)
$13 = "abc"

Хорошо, теперь все работает, как ожидалось, однако я хочу использовать этот код в gdb.parse_and_eval () для красивого принтера на Python. Теперь это будет вызывать malloc много раз, создавая утечку памяти. Так что просто звоните бесплатно ()? Теперь происходит нечто неожиданное:

(gdb) call free($pointer)
$14 = 0
(gdb) p *((QString*)$pointer)
$15 = "abc"

Указатель все еще кажется действительным, что, конечно, может быть совершенно нормально, поскольку память не использовалась повторно. Однако я не уверен, нормально ли это, потому что после выделения еще нескольких блоков памяти, которые соответствуют ровно одной QString, значение указателя все еще не было повторно использовано malloc.

Я создаю большую утечку памяти, если использую это в довольно -printer, который может вызываться много раз во время сеанса отладки? Есть ли более простое решение для создания желаемого результата (например, с использованием Python API)?

Также не связано с этим, почему free (3) дает мне возвращаемое значение 0, хотя на самом деле оно недействительно?

8
задан ar31 14 August 2011 в 22:19
поделиться