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 <[email protected]>
> ---
> 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;
>
--
Crash-utility mailing list
[email protected]
https://listman.redhat.com/mailman/listinfo/crash-utility
Contribution Guidelines: https://github.com/crash-utility/crash/wiki