使用GDB進行調試時,我想將便捷變量設置爲新構造的值。如何在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()的巨蟒漂亮的打印。現在這會調用malloc很多次,造成內存泄漏。所以,只需撥打免費()?現在,意想不到的事情發生:
(gdb) call free($pointer)
$14 = 0
(gdb) p *((QString*)$pointer)
$15 = "abc"
指針似乎仍然有效,當然,這可能是完全正常的,因爲內存沒有得到重用。不過,我不確定這是否可行,因爲在分配了幾個更符合一個QString的內存塊之後,指針值仍然沒有被malloc重用。
我是不是創建一個大的內存泄漏,如果我用這個在一個漂亮的打印機,這很可能在調試會話期間被調用很多次?有沒有更容易的解決方案來創建所需的結果(即使用Python API)?
也無關這一點,爲什麼是免費的(3)給我的返回值爲0,而它實際上是無效?