내가 커널 연결리스트에 액세스를 시도하고, 구조}container_of 매크로
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'를 사용하여 주소를 가져옵니다. ? 왜 작동하지
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을 구현 : 그래서 난 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
이 출력은 수행 한 후입니까?
안녕하세요, 귀하의 회신을 기다리고 있습니다 ... –