2014-01-20 46 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