- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试访问内核链表,结构是
struct my_struct {
struct my_hardware_context ahw;
struct net_device *netdev;
struct pci_dev *pdev;
struct list_head mac_list;
struct list_head wait_list;
....
....
};
使用 gdb,我可以通过以下方式打印:
(gdb)p *(qlcnic_wait_event_t *)(((struct my_struct *)dev_base->next->priv).wait_list)
输出是:
$17 = {
list = {
next = 0x410026a14ff0,
prev = 0x410026a14ff0
},
comp_id = 0x0,
trigger = 0x0,
active = 0x0,
rsp_word = 0x0 <buses_init at vmkdrivers/src_9/vmklinux_9/linux/drivers/base/bus.c:1061>
要迭代列表,我需要转到 wait_list
的“next”并使用“container_of”获取地址的基础。所以我正在使用 container_of 宏,代码是
#!/usr/bin/env python
import gdb
long_type = None
def get_type(type_name):
t = gdb.lookup_type(type_name)
if t == None:
raise gdb.GdbError("cannot resolve type '%s'" % type_name)
return t
def get_long_type():
global long_type
if long_type == None:
long_type = get_type("long")
return long_type
def offset_of(typeobj, field):
element = gdb.Value(0).cast(typeobj)
return int(str(element[field].address), 16)
def container_of(ptr, typeobj, member):
return (ptr.cast(get_long_type()) - offset_of(typeobj, member)).cast(typeobj)
class ContainerOf(gdb.Function):
__doc__ = "Return pointer to containing data structure.\n" \
"\n" \
"$container_of(PTR, \"TYPE\", \"ELEMENT\"): Given PTR, return a pointer to the\n" \
"data structure of the type TYPE in which PTR is the address of ELEMENT.\n" \
"Note that TYPE and ELEMENT have to be quoted as strings."
def __init__(self):
super(ContainerOf, self).__init__("container_of")
def invoke(self, ptr, typename, elementname):
return container_of(ptr,
gdb.lookup_type(typename.string()).pointer(),
elementname.string())
ContainerOf()
ptr = gdb.parse_and_eval('(qlcnic_wait_event_t *)(((struct my_struct *)dev_base->next->priv).wait_list)').address
print '%s'%(ptr)
c = container_of(ptr,"qlcnic_wait_event_t","list")
完成(gdb) source container_of.py
输出是:
wait_list = {
list = {
next = 0x410026a14ff0,
prev = 0x410026a14ff0
},
comp_id = 0x0,
trigger = 0x0,
active = 0x0,
rsp_word = 0x0 <buses_init at /src_9/linux_9/drivers/base/bus.c:1061>
}
ptr = 0x410026a14ff0
Traceback (most recent call last):
File "container_of.py", line 64, in ?
next = container_of(ptr,"struct qlcnic_wait_event_s","list")
File "container_of.py", line 23, in container_of
return (ptr.cast(get_long_type()) - offset_of(typeobj, member)).cast(typeobj)
File "container_of.py", line 19, in offset_of
element = gdb.Value(0).cast(typeobj)
RuntimeError: Argument must be a type.
为什么它不起作用?如何实现这个 container_of ?
最佳答案
您的代码的问题是 cast() 需要一个 gdb.Type 在这一点,不是一个字符串。调用 gdb.lookup_type() 将修复该部分。
关于offsetof/container_of:目前最方便的方法让它工作是使用 gdb 的宏工具。这只是因为它更容易访问函数或命令。
(gdb) macro define offsetof(_type, _memb) \
((long)(&((_type *)0)->_memb))
(gdb) macro define container_of(_ptr, _type, _memb) \
((_type *)((void *)(_ptr) - offsetof(_type, _memb)))
这可能会进入您的 .gdbinit。
(gdb) print offsetof(struct foo, bar)
...
要在 Python 中使用它,您可以用相同的方式重新实现它您开始使用 gdb.Type/Field 和转换操作,或者再次依赖宏定义:
(gdb) python print gdb.parse_and_eval("offsetof(struct foo, bar)")
...
关于python - gdb python 中的 container_of 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17024695/
List.h 定义了一个名为 list_entry 的宏,它是 container_of() 函数的包装器。一个优雅的函数,看起来很精致: 考虑这段代码: tmp = list_entry(pos,(
这个问题在这里已经有了答案: Rationale behind the container_of macro in linux/list.h (1 个回答) 关闭 9 年前。 嗨,为什么 conta
谁能给我解释一下这两个宏? #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #define container_of(pt
我不确定我做错了什么,但现在是时候多加留意了。我使用 device_create() 制作一个设备,提供一些“额外数据”,如下所示: pDevice = device_create(ahcip
我试图通过编写一个小程序来理解 container_of 宏,但我没有得到预期的结果。我写的程序是: typedef struct node { int id1; int id2;
如果我有: struct my_container { int x; struct some_struct *ss; } 如果我有指针 ss,通过它我可以访问 some_struct
我尝试在 linux 内核中使用 container_of 宏。 我通过google得到的结果如下 #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *
我是一个尝试编写串行驱动程序(基于 PCI)的新手,我不想使用 container_of() 因为缺乏向下兼容性。我可能会编译模块的内核版本将是 use_count )。我不想使用 container
例如在 Linux 驱动程序开发中,可以找到 container_of宏。本质上,它是 -> 的反向运算符,如果您获得指向成员的指针,则生成指向包含结构的指针。 除了 Greg Kroah 的博客之外
Linux内核(和其他地方)中常用的宏是container_of,其(基本上)定义如下: #define container_of(ptr, type, member) (((type) *)((ch
我知道宏是做什么的。 在许多内核级代码中,经常使用它来遍历链表。 我想找到其他有用的案例。 你什么时候使用 container_of 或 CONTAINING_RECORD宏? 什么时候宏非常有用?
我想知道如何使用 container_of 设置 epoll。我正在使用最新版本的 ubuntu 和 eclipse-cdt (gcc)。我的想法是抓取事件,然后抓取事件来自的容器。 如果我有这样的结
我正在编写一个访问 PCI 卡的简单字符驱动程序。它在新类的帮助下注册到 sysfs。现在我想以一种方便的方式访问设备的多个参数(即版本、状态、控制......)。我想向设备注册多个属性(通过 dev
我正在阅读 John Madieu 的 Linux Device Drivers Development,其中一段说 The container_of macro won't work for cha
我一直在使用我自己的 container_of 类型函数,它不依赖于 GNU 或 C99,(即,它适用于不同版本的 MSVC。) #include /* offsetof */ #include
宏定义为 #define container_of(ptr, type, member) ({ \ const typeof( ((type
我们有container_of的链表实现如下: #define container_of(ptr, type, member) ({ const typeof( ((type *)0)->memb
我想从头开始实现 container_of 宏/函数,就像 linux 内核中可用的那样,以从父结构的成员获取父结构的地址。 例如如果父结构是 struct parent{ int id; struc
在查看 Linux 内核的双向链接循环列表实现时,我发现了以下宏: #define container_of(ptr, type, member) ({ \ const typeo
我正在尝试访问内核链表,结构是 struct my_struct { struct my_hardware_context ahw; struct net_device *netdev; struct
我是一名优秀的程序员,十分优秀!