2014-01-20 49 views
5

這裏是在C中的結構的定義:打印的結構陣列變量的值在GDB

typedef struct projection { 
    angle_t angle; 
    int size; 
    element_t *element; 
} projection_t; 

projection_t *projections; 
projections = (projection_t *)malloc(sizeof(projection_t)*m); 

這種結構的陣列的定義和值被分配給每個投影的變量。使用GDB,我試圖顯示每個投影的大小的值。逐個打印值是一個沉重的過程。

我知道數組的內容可以用print *[email protected]來顯示,但我不知道是否可以用@操作數輕鬆訪問投影的大小值。

+0

-1你拒絕了兩個非常好的答案,建議在gdb中使用python或幾個指令作爲不方便,然後修改你的C代碼?你應該澄清你的「容易」的定義,這樣讀者不會浪費時間去幫助你。 – 2014-01-21 12:02:57

+1

這些答案爲我解決問題提供了很好的信息,正如我在評論中強調的那樣。這絕對不是浪費時間,也不應該被視爲被拒絕,因爲我確信它可以幫助其他知道Python的用戶。 是的,我認爲在C代碼中添加一些指令並使用「調用」函數是一個很好的選擇,因爲它可能對每個人都有幫助。 – denaitre

回答

1

我不想在每次啓動GDB時編寫一個循環,漂亮的打印機依賴於Python,它不適合我。在GDB中打印非連續內存空間的變量值似乎並不容易。

我最終找到了一種似乎是最簡單的方法。我在代碼中寫了一個C函數打印我需要得到的值:

void print(projection_t *projections, int size) 
{ 
    int i; 
    for(i=0; i<size; i++) 
     printf("proj_%d: size=%d\n", i, projections[i].size); 
} 

它可以調用從GDB的功能,當我要打印的每張投影尺寸:

(gdb) call print(projections, len) 
proj_0: size=1027 
proj_1: size=1024 
proj_2: size=1027 
proj_3: size=1030 
6

雖然沒有使用@操作數,你可以嘗試以下方法來實現自己的目標:

(gdb)set $i=0 
(gdb) set $end=m 
(gdb) while ($i < $end) 
>p projections[$i++].size 
>end 

或使用

p projections[index].size 

打印尺寸爲給定的指標。

+1

[文檔](https://sourceware.org/gdb/onlinedocs/gdb/Arrays.html#Arrays)提供了類似的東西,沒有循環。 – Hasturkun

+0

是的,但沒有循環,不提供邊界檢查。這意味着如果有人繼續按,那麼他最終可能會檢查指定大小的投影數組中的內存。 – nikpel7

+0

感謝您的回覆。是的,兩者都有效,但在我看來並不方便。第一個需要寫一個循環和相關變量,第二個是我在帖子中「一個接一個」的意思。 – denaitre

9

可以註冊蟒蛇很prointer:https://sourceware.org/gdb/onlinedocs/gdb/Writing-a-Pretty_002dPrinter.html,並用它來獲得這樣的:

(gdb) p *[email protected] 
$1 = {10, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 
(gdb) 

這是例子蟒蛇漂亮打印機:

>cat my_printer.py 
class projection_printer: 
    def __init__(self, val): 
     self.val = val 

    def to_string(self): 
     return str(self.val['size']) 


import gdb.printing 

def build_pretty_printer(): 
    pp = gdb.printing.RegexpCollectionPrettyPrinter("") 
    pp.add_printer('projection', '^projection$', projection_printer) 
    return pp 
gdb.printing.register_pretty_printer(gdb.current_objfile(), build_pretty_printer()) 

這是一個測試程序:

>cat main.cpp 
#include <stdlib.h> 

typedef struct angle 
{ 
    int a; 
} angle_t; 


typedef struct projection { 
    angle_t angle; 
    int size; 
} projection_t; 


int main() 
{ 
    projection_t *projections; 
    projections = (projection_t *)malloc(sizeof(projection_t)*10); 
    projections[0].size = 10; 
    projections[0].angle.a = 20; 

    return 0; 
} 

而這是gdb會話:

>gdb -q -x my_printer.py a.out 
Reading symbols from /home/a.out...done. 
(gdb) start 
Temporary breakpoint 1 at 0x4005ac: file main.cpp, line 18. 
Starting program: /home/a.out 

Temporary breakpoint 1, main() at main.cpp:18 
18  projections = (projection_t *)malloc(sizeof(projection_t)*10); 
(gdb) n 
19  projections[0].size = 10; 
(gdb) 
20  projections[0].angle.a = 20; 
(gdb) 
22  return 0; 
(gdb) p *[email protected] 
$1 = {10, 0, 0, 0, 0, 0, 0, 0, 0, 0 } 
(gdb) 
+0

感謝您的回覆:)我投票了,因爲它工作,並由GDB的文件支持。然而,這個解決方案依賴於Python,在我的情況下這不是一個簡單的解決方案。 – denaitre