使用 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.
所以我假设需要一个 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 很多次,造成内存泄漏。所以只需调用free()?现在发生了一些意想不到的事情:
(gdb) call free($pointer)
$14 = 0
(gdb) p *((QString*)$pointer)
$15 = "abc"
指针似乎仍然有效,这当然可以很好,因为内存没有被重用。但是我不确定这是否可行,因为在分配了更多正好适合一个 QString 的内存块之后,指针值仍然没有被 malloc 重用。
如果我在漂亮的打印机中使用它,我是否会造成很大的内存泄漏,这可能会在调试会话期间被调用很多次?有没有更简单的解决方案来创建所需的结果(即使用 Python API)?
也与此无关,为什么 free(3) 给我一个返回值 0 而它实际上是无效的?