linux 如何访问Python地理数据库值的键或值

csga3l58  于 2022-11-02  发布在  Linux
关注(0)|答案(3)|浏览(121)

我在GDB中有一个结构体,我想运行一个脚本来检查这个结构体。在Python GDB中,你可以通过

(gdb) python mystruct = gdb.parse_and_eval("mystruct")

现在我得到了一个名为mystruct的变量,它是一个GDB.Value对象,我可以通过简单地将这个对象作为字典来访问该结构体的所有成员(比如mystruct['member'])。
问题是,我的脚本不知道某个结构体有哪些成员。所以我想从这个GDB.Value对象中得到键(甚至值)。但是mystruct.values()mystruct.keys()在这里都不起作用。
有没有可能访问这些信息?我认为这是非常不可能的,你不能访问这些信息,但我没有找到它的任何地方。一个dir(mystruct)显示,我也没有键或值函数。我可以看到所有的成员,通过打印mystruct,但有没有一种方法来获得成员在python?

7cwmlq89

7cwmlq891#

从GDB文档:
你可以这样得到mystruct的类型:

tp = mystruct.type

并通过tp.fields()在字段上迭代
不需要邪恶的变通办法;- )

**更新:**GDB 7.4刚刚发布。从announcement

现在,结构和联合类型的类型对象允许使用标准Python字典(Map)方法访问字段。

fxnxkyjh

fxnxkyjh2#

邪恶的解决方法:

python print eval("dict(" + str(mystruct)[1:-2] + ")")

我不知道这是否是通用的。作为一个演示,我写了一个最小的例子test.cpp


# include <iostream>

struct mystruct
{
  int i;
  double x;
} mystruct_1;

int main ()
{
  mystruct_1.i = 2;
  mystruct_1.x = 1.242;
  std::cout << "Blarz";
  std::cout << std::endl;
}

现在,我像往常一样运行g++ -g test.cpp -o test,并启动gdb test

(gdb) break main
Breakpoint 1 at 0x400898: file test.cpp, line 11.
(gdb) run
Starting program: ...

Breakpoint 1, main () at test.cpp:11
11        mystruct_1.i = 2;
(gdb) step
12        mystruct_1.x = 1.242;
(gdb) step
13        std::cout << "Blarz";
(gdb) python mystruct = gdb.parse_and_eval("mystruct_1")
(gdb) python print mystruct
{i = 2, x = 1.242}
(gdb) python print eval("dict(" + str(mystruct)[1:-2] + ")")
{'i': 2, 'x': 1.24}
(gdb) python print eval("dict(" + str(mystruct)[1:-2] + ")").keys()
['i', 'x']
ubby3x7f

ubby3x7f3#

这些天来:

(gdb) python import sys; print(sys.version)
3.10.8 (main, Oct 15 2022, 19:00:40)  [GCC 12.2.0 64 bit (AMD64)]

......它变得简单多了,属性是dict中的键-下面是一个示例:
test_struct.c


# include <stdint.h>

# include <stdio.h>

struct mystruct_s {
  uint8_t member;
  uint8_t list[5];
};
typedef struct mystruct_s mystruct_t;

mystruct_t mystruct = {
  .member = 0,
  .list = { 10, 20, 30, 40, 50 },
};

int main(void) {
  printf("mystruct.member %d\n", mystruct.member);
  for(uint8_t ix=0; ix<sizeof(mystruct.list); ix++) {
    printf("mystruct.list[%d]: %d\n", ix, mystruct.list[ix]);
  }
}

然后编译并输入gdb:

gcc -g -o test_struct.exe test_struct.c
gdb --args ./test_struct.exe

...然后在gdb中:

(gdb) b main
Breakpoint 1 at 0x140001591: file test_struct.c, line 16.

(gdb) python ms = gdb.parse_and_eval("mystruct")
(gdb) python print(ms)
{member = 0 '\000', list = "\n\024\036(2"}
(gdb) python print(ms['member'])
0 '\000'
(gdb) python print(ms['list'])
"\n\024\036(2"

(gdb) python for ix in range(0,5): print("mystruct.list[{}]: {}".format(ix, ms['list'][ix]))
mystruct.list[0]: 10 '\n'
mystruct.list[1]: 20 '\024'
mystruct.list[2]: 30 '\036'
mystruct.list[3]: 40 '('
mystruct.list[4]: 50 '2'

相关问题