在 2021年04月02日 15:02, HAGIO KAZUHITO(萩尾 一仁) 写道: > -----Original Message----- >> In the show_member_offset() function, when trying to handle function >> pointers, the case for "(*" is handled. However, if the function >> pointer returns a pointer or a pointer to a pointer, then the >> condition is unhandled. This results in the offset not being printed. >> >> Fix by first checking if the member is potentially a function pointer, >> then checking if it returns a pointer or a pointer to a pointer. >> >> Signed-off-by: John Pittman <jpittman@xxxxxxxxxx> > > Good catch... I've confirmed that the patch works as expected with RHEL7's > struct offload_callbacks: > > crash> struct -o offload_callbacks > struct offload_callbacks { > [0] struct sk_buff *(*gso_segment)(struct sk_buff *, netdev_features_t); > [8] struct sk_buff **(*gro_receive)(struct sk_buff **, struct sk_buff *); > [16] int (*gro_complete)(struct sk_buff *, int); > } > SIZE: 24 This should be a good example for the case described in patch log. But I didn't reproduce it on rhel7 before applying this patch, it's strange. ... KERNEL: /usr/lib/debug/lib/modules/3.10.0-1160.24.1.el7.x86_64/vmlinux ... RELEASE: 3.10.0-1160.24.1.el7.x86_64 VERSION: #1 SMP Thu Mar 25 21:21:56 UTC 2021 MACHINE: x86_64 (2892 Mhz) MEMORY: 4 GB PID: 7815 COMMAND: "crash" TASK: ffffa10210512100 [THREAD_INFO: ffffa10189b34000] CPU: 1 STATE: TASK_RUNNING (ACTIVE) crash> struct -o offload_callbacks struct offload_callbacks { struct sk_buff *(*gso_segment)(struct sk_buff *, netdev_features_t); struct sk_buff **(*gro_receive)(struct sk_buff **, struct sk_buff *); [16] int (*gro_complete)(struct sk_buff *, int); } SIZE: 24 Do you happen to know how to reproduce this issue? John Pittman. Thanks. Lianbo > > Acked-by: Kazuhito Hagio <k-hagio-ab@xxxxxxx> > > Thanks, > Kazu > >> --- >> symbols.c | 11 +++++++++-- >> 1 file changed, 9 insertions(+), 2 deletions(-) >> >> diff --git a/symbols.c b/symbols.c >> index a2d5c6c..5d7da6e 100644 >> --- a/symbols.c >> +++ b/symbols.c >> @@ -8356,8 +8356,15 @@ show_member_offset(FILE *ofp, struct datatype_member *dm, char *inbuf) >> } >> } else if (c) { >> for (i = 0; i < c; i++) { >> - if (STRNEQ(arglist[i], "(*")) { >> - target = arglist[i]+2; >> + if (strstr(inbuf, "(*")) { >> + if (STRNEQ(arglist[i], "(*")) >> + target = arglist[i]+2; >> + else if (STRNEQ(arglist[i], "*(*")) >> + target = arglist[i]+3; >> + else if (STRNEQ(arglist[i], "**(*")) >> + target = arglist[i]+4; >> + else >> + continue; >> if (!(t1 = strstr(target, ")"))) >> continue; >> *t1 = NULLCHAR; >> -- >> 2.17.2 > -- Crash-utility mailing list Crash-utility@xxxxxxxxxx https://listman.redhat.com/mailman/listinfo/crash-utility