我有一個指針的下面的列表:如何在gdb中打印指針列表的內容?
(這裏是一個簡單的例子,但在現實中,我還可以列舉由數百個條目被componed)
{0xae5c4e8, 0xa09d4e8, 0xa753458, 0xae554e8}
我成功地打印指針的內容,一個一個,使用:
p *(const Point *) 0xae5c4e8
我如何可以打印一個命令前面列出的內容是什麼?
我有一個指針的下面的列表:如何在gdb中打印指針列表的內容?
(這裏是一個簡單的例子,但在現實中,我還可以列舉由數百個條目被componed)
{0xae5c4e8, 0xa09d4e8, 0xa753458, 0xae554e8}
我成功地打印指針的內容,一個一個,使用:
p *(const Point *) 0xae5c4e8
我如何可以打印一個命令前面列出的內容是什麼?
沒有罐裝的方式來做到這一點。如果你可以鍵入print *(*p @ 23)
- 在另一個表達式中使用@
擴展,將會很酷,從而導致隱式循環 - 但是你不能。
但是,有兩種體面的方法可以做到這一點。
一種方法是使用Python。例如:
(gdb) python x = gdb.parse_and_eval('my_array')
(gdb) python
> for i in range(nnn):
> print x[i].dereference()
> end
您可以很容易地將它封裝在一個用Python編寫的新gdb命令中。
另一種方法是使用define
使用gdb命令語言來創建自己的命令。與Python方法相比,這有點醜陋,並且有一些(次要的)限制,但它仍然是可行的。
最後,曾經有一個名爲「決鬥」的gdb擴展提供了此功能。不幸的是,它從未合併過。
我不認爲有一個簡單的方法來一次顯示所有的列表元素。您可以嘗試使用以下項目進行迭代:
set $it=mylist.begin()._M_node
print *(*(std::_List_node<const Point *>*)$it)._M_data
set $it=(*$it)._M_next
...
以批處理方式。問題是列表項不需要在內存中彼此靠近。要在調試中有更好的預覽選項,您可以切換到std::vector
。
希望這會有所幫助。
我有一個指針名單如下:
你似乎不具有列表,你似乎有一個數組。讓我們假設它看起來是這樣的:
void *array[10] = {0xae5c4e8, 0xa09d4e8, 0xa753458, 0xae554e8};
可以打印前4解除引用該數組的元素,像這樣:
(gdb) print ((Point**)array)[0]@4
1)我認爲它應該是print \ *((Point **)數組)[0] @ 4。 2)Arraylist是一個數組和一個列表。 :) – dbrank0 2015-03-26 07:28:06
列表本身的數據類型是什麼? – 2015-03-25 17:39:05
Roguewave Container – 2015-03-25 17:42:00