При отладке с помощью 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, хотя на самом деле оно недействительно?