2015-03-25 61 views
2

我有一個指針的下面的列表:如何在gdb中打印指針列表的內容?

(這裏是一個簡單的例子,但在現實中,我還可以列舉由數百個條目被componed)

{0xae5c4e8, 0xa09d4e8, 0xa753458, 0xae554e8} 

我成功地打印指針的內容,一個一個,使用:

p *(const Point *) 0xae5c4e8 

我如何可以打印一個命令前面列出的內容是什麼?

+0

列表本身的數據類型是什麼? – 2015-03-25 17:39:05

+0

Roguewave Container – 2015-03-25 17:42:00

回答

4

沒有罐裝的方式來做到這一點。如果你可以鍵入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擴展提供了此功能。不幸的是,它從未合併過。

1

我不認爲有一個簡單的方法來一次顯示所有的列表元素。您可以嘗試使用以下項目進行迭代:

set $it=mylist.begin()._M_node 
print *(*(std::_List_node<const Point *>*)$it)._M_data 
set $it=(*$it)._M_next 
... 

以批處理方式。問題是列表項不需要在內存中彼此靠近。要在調試中有更好的預覽選項,您可以切換到std::vector

希望這會有所幫助。

0

我有一個指針名單如下:

你似乎不具有列表,你似乎有一個數組。讓我們假設它看起來是這樣的:

void *array[10] = {0xae5c4e8, 0xa09d4e8, 0xa753458, 0xae554e8}; 

可以打印前4解除引用該數組的元素,像這樣:

(gdb) print ((Point**)array)[0]@4 
+0

1)我認爲它應該是print \ *((Point **)數組)[0] @ 4。 2)Arraylist是一個數組和一個列表。 :) – dbrank0 2015-03-26 07:28:06