以下是C中结构的定义:
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 *projections@len
显示,但我不知道是否可以使用@
操作数轻松访问投影大小的值。
答案 0 :(得分:12)
你可以注册python pretty prointer:https://sourceware.org/gdb/onlinedocs/gdb/Writing-a-Pretty_002dPrinter.html并用它来得到这样的东西:
(gdb) p *projections@10
$1 = {10, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
(gdb)
这是一个python漂亮的打印机的例子:
>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 *projections@10
$1 = {10, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
(gdb)
答案 1 :(得分:10)
虽然不使用@操作数,但您可以尝试以下方法来实现目标:
(gdb)set $i=0
(gdb) set $end=m
(gdb) while ($i < $end)
>p projections[$i++].size
>end
或使用
p projections[index].size
打印给定索引的大小。
答案 2 :(得分:2)
每次启动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
答案 3 :(得分:0)
定义一个函数,该函数可打印出循环中的每个元素。您只需要定义一次功能。将$ m设置为等于您分配的投影数。然后,您可以使用一个命令行输入打印出所有内容。
(gdb) set $m=4
(gdb) define f
>set $i=0
>while ($i<$m)
> p projections[$i++].size
> end
>end
(gdb) f