Hi Lianbo,
On 2022/05/26 16:07, Lianbo Jiang wrote:
Currently, the 'struct -o' command does not display the
offsets
of struct fields like this:
crash> struct page -ox ffffce98870a0d40
struct page {
[ffffce98870a0d40] unsigned long flags;
union {
struct {...};
struct {...};
struct {...};
struct {...};
struct {...};
struct {...};
struct {...};
[ffffce98870a0d48] struct callback_head callback_head;
};
...
}
SIZE: 0x40
Good catch!
The gdb-10.2 added a new option '/o' for the 'ptype' command, which
prints the offsets and sizes of struct fields, let's use it now to
fix the above issue.
but isn't there another gdb option or setting to show their details?
(gdb) ptype struct page
type = struct page {
unsigned long flags;
union {
struct {...};
struct {...};
struct {...};
...
If there is no setting other than '/o', it's a bit strange UI design,
I think.. (although I cannot find so far..)
Also the 'ptype /o' overdoes unfolding struct members,
and extra spaces and lines are printed with the patch:
* crash-7.3.2
crash-7.3.2> struct address_space
struct address_space {
struct inode *host;
struct xarray i_pages;
atomic_t i_mmap_writable;
struct rb_root_cached i_mmap;
struct rw_semaphore i_mmap_rwsem;
unsigned long nrpages;
...
crash-7.3.2> struct -o address_space
struct address_space {
[0] struct inode *host;
[8] struct xarray i_pages;
[32] atomic_t i_mmap_writable;
[40] struct rb_root_cached i_mmap;
[56] struct rw_semaphore i_mmap_rwsem;
[96] unsigned long nrpages;
* With the patch
crash-dev> struct address_space
struct address_space {
struct inode *host;
struct xarray {
spinlock_t xa_lock;
gfp_t xa_flags;
void *xa_head;
size_t xarray_size_rh;
struct xarray_rh {
<no data fields>
} _rh;
} i_pages;
atomic_t i_mmap_writable;
struct rb_root_cached {
struct rb_root {
struct rb_node *rb_node;
...
crash-dev> struct -o address_space
struct address_space {
[0] struct inode *host;
struct xarray {
spinlock_t xa_lock;
gfp_t xa_flags;
void *xa_head;
size_t xarray_size_rh;
struct xarray_rh {
<no data fields>
} _rh;
[8] } i_pages;
[32] atomic_t i_mmap_writable;
struct rb_root_cached {
struct rb_root {
struct rb_node *rb_node;
...
task_struct also looks wrong:
crash-dev> struct -o task_struct
struct task_struct {
struct thread_info {
[36] unsigned long flags;
u32 status;
[0] } thread_info;
[16] volatile long state;
[24] void *stack;
...
If no another gdb setting, we will need to rewrite the parser.
So first, I'd like to know whether there is no another setting.
Thanks,
Kazu
>
> Signed-off-by: Lianbo Jiang <lijiang(a)redhat.com>
> ---
> symbols.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/symbols.c b/symbols.c
> index 5d12a021c769..9ba43dee61c8 100644
> --- a/symbols.c
> +++ b/symbols.c
> @@ -6845,6 +6845,16 @@ do_datatype_declaration(struct datatype_member *dm, ulong
flags)
> len = dm->size;
> multiline = NULL;
> while (fgets(buf, BUFSIZE, pc->tmpfile)) {
> + char *p = NULL;
> +
> + p = strstr(buf, "*/");
> + if (p) {
> + p += strlen("*/");
> + shift_string_left(buf, p - buf);
> + if (strstr(buf, "type = "))
> + strip_beginning_whitespace(buf);
> + }
> +
> if (STRNEQ(buf, "type = ")) {
> multiline = strstr(buf, "{");
> if (flags & TYPEDEF)
> @@ -7802,7 +7812,7 @@ whatis_datatype(char *st, ulong flags, FILE *ofp)
> else if (flags & UNION_REQUEST)
> sprintf(lookbuf, "ptype union %s", st);
> else if (flags & STRUCT_REQUEST)
> - sprintf(lookbuf, "ptype struct %s", st);
> + sprintf(lookbuf, "ptype /o struct %s", st);
> else
> return;
>