При отладке с помощью 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 overload-resolution off
, что привело к следующему:
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.
Итак, я предположил, что этот указатель необходим:
(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 повторно.
Создаю ли я большую утечку памяти, если я использую это в красивом принтере, который вполне может вызываться много раз во время сеанса отладки? Есть ли более простое решение для создания желаемого результата (например, с использованием API Python)?
Также не имеет отношения к этому, почему free(3) возвращает мне возвращаемое значение 0, хотя на самом деле оно недействительно?