[Crash-utility] enhance print command

Ming Zhang blackmagic02881 at gmail.com
Fri Feb 1 14:50:03 UTC 2008


On Fri, 2008-02-01 at 09:11 -0500, Dave Anderson wrote:
> Ming Zhang wrote:
> > Hi All
> > 
> > I wonder if this is doable or already there? Now for example, if use
> > "print" to check a function pointer array, it only shows the content.
> > then for each value, we have run sym <value> to see which symbol it is.
> > is it possible for the "print" command do this automatically? Thanks.
> > 
> > 
> > 
> 
> It's all handled by the embedded gdb module, and it does attempt
> to translate structure members that are declared as function pointers.
> 
> Take the file_operations structure for exmample:
> 
> crash> file_operations
> struct file_operations {
>      struct module *owner;
>      loff_t (*llseek)(struct file *, loff_t, int);
>      ssize_t (*read)(struct file *, char *, size_t, loff_t *);
>      ssize_t (*aio_read)(struct kiocb *, char *, size_t, loff_t);
>      ssize_t (*write)(struct file *, const char *, size_t, loff_t *);
>      ssize_t (*aio_write)(struct kiocb *, const char *, size_t, loff_t);
>      int (*readdir)(struct file *, void *, filldir_t);
>      unsigned int (*poll)(struct file *, struct poll_table_struct *);
>      int (*ioctl)(struct inode *, struct file *, unsigned int, long unsigned int);
>      long int (*unlocked_ioctl)(struct file *, unsigned int, long unsigned int);
>      long int (*compat_ioctl)(struct file *, unsigned int, long unsigned int);
>      int (*mmap)(struct file *, struct vm_area_struct *);
>      int (*open)(struct inode *, struct file *);
>      int (*flush)(struct file *, fl_owner_t);
>      int (*release)(struct inode *, struct file *);
>      int (*fsync)(struct file *, struct dentry *, int);
>      int (*aio_fsync)(struct kiocb *, int);
>      int (*fasync)(int, struct file *, int);
>      int (*lock)(struct file *, int, struct file_lock *);
>      ssize_t (*readv)(struct file *, const struct iovec *, long unsigned int, 
> loff_t *);
>      ssize_t (*writev)(struct file *, const struct iovec *, long unsigned int, 
> loff_t *);
>      ssize_t (*sendfile)(struct file *, loff_t *, size_t, read_actor_t, void *);
>      ssize_t (*sendpage)(struct file *, struct page *, int, size_t, loff_t *, int);
>      long unsigned int (*get_unmapped_area)(struct file *, long unsigned int, 
> long unsigned int, long unsigned int
> , long unsigned int);
>      int (*check_flags)(int);
>      int (*dir_notify)(struct file *, long unsigned int);
>      int (*flock)(struct file *, int, struct file_lock *);
>      ssize_t (*splice_write)(struct pipe_inode_info *, struct file *, loff_t *, 
> size_t, unsigned int);
>      ssize_t (*splice_read)(struct file *, loff_t *, struct pipe_inode_info *, 
> size_t, unsigned int);
> }
> SIZE: 116
> crash>
> 
> And then here's an instance of one:
> 
> crash> whatis sysfs_file_operations
> const struct file_operations sysfs_file_operations;
> crash> p sysfs_file_operations
> sysfs_file_operations = $5 = {
>    owner = 0x0,
>    llseek = 0xc04704d5 <generic_file_llseek>,
>    read = 0xc04a4fb7 <sysfs_read_file>,
>    aio_read = 0,
>    write = 0xc04a49ab <sysfs_write_file>,
>    aio_write = 0,
>    readdir = 0,
>    poll = 0xc04a4966 <sysfs_poll>,
>    ioctl = 0,
>    unlocked_ioctl = 0,
>    compat_ioctl = 0,
>    mmap = 0,
>    open = 0xc04a4c92 <sysfs_open_file>,
>    flush = 0,
>    release = 0xc04a4e31 <sysfs_release>,
>    fsync = 0,
>    aio_fsync = 0,
>    fasync = 0,
>    lock = 0,
>    readv = 0,
>    writev = 0,
>    sendfile = 0,
>    sendpage = 0,
>    get_unmapped_area = 0,
>    check_flags = 0,
>    dir_notify = 0,
>    flock = 0,
>    splice_write = 0,
>    splice_read = 0
> }
> crash>
> 
> If it's from a module, it will require its debuginfo to be loaded:
> 
> crash> p ext3_file_operations
> p: gdb request failed: p ext3_file_operations
> crash> mod -s ext3
>   MODULE   NAME                  SIZE  OBJECT FILE
> e08c4f80  ext3                123337 
> /lib/modules/2.6.18-53.el5/kernel/fs/ext3/ext3.ko
> crash> p ext3_file_operations
> ext3_file_operations = $8 = {
>    owner = 0x0,
>    llseek = 0xc04704d5 <generic_file_llseek>,
>    read = 0xc046f9d6 <do_sync_read>,
>    aio_read = 0xc0455989 <generic_file_aio_read>,
>    write = 0xc046f8e5 <do_sync_write>,
>    aio_write = 0xe08a9e70 <ext3_file_write>,
>    readdir = 0,
>    poll = 0,
>    ioctl = 0xe08ae388 <ext3_ioctl>,
>    unlocked_ioctl = 0,
>    compat_ioctl = 0,
>    mmap = 0xc0454476 <generic_file_mmap>,
>    open = 0xc046e4a6 <generic_file_open>,
>    flush = 0,
>    release = 0xe08a9ef3 <ext3_release_file>,
>    fsync = 0xe08a9f50 <ext3_sync_file>,
>    aio_fsync = 0,
>    fasync = 0,
>    lock = 0,
>    readv = 0xc0456b24 <generic_file_readv>,
>    writev = 0xc045662a <generic_file_writev>,
>    sendfile = 0xc0455109 <generic_file_sendfile>,
>    sendpage = 0,
>    get_unmapped_area = 0,
>    check_flags = 0,
>    dir_notify = 0,
>    flock = 0,
>    splice_write = 0xc0490781 <generic_file_splice_write>,
>    splice_read = 0xc0490809 <generic_file_splice_read>
> }
> crash>
> 
> If the debuginfo data is not available, or for whatever reason
> you're not getting symbolic translations, you can always "rd -s"
> the memory symbolically, which is probably more efficient than
> running "sym" on each address.
> 
> For example, the file_operations structure is 116 bytes long, or
> 29 words on an 32-bit system.  Even if I didn't have the ext3 module's
> debuginfo available, crash still knows about its exported symbols:
> 
> crash> rd -s ext3_file_operations 29
> e08b8d40:  00000000 generic_file_llseek do_sync_read generic_file_aio_read
> e08b8d50:  do_sync_write ext3_file_write 00000000 00000000
> e08b8d60:  ext3_ioctl 00000000 00000000 generic_file_mmap
> e08b8d70:  generic_file_open 00000000 ext3_release_file ext3_sync_file
> e08b8d80:  00000000 00000000 00000000 generic_file_readv
> e08b8d90:  generic_file_writev generic_file_sendfile 00000000 00000000
> e08b8da0:  00000000 00000000 00000000 generic_file_splice_write
> e08b8db0:  generic_file_splice_read
> crash>


thanks a lot, both tips helps. also i update to latest crash and it show
symbol more reliably than the one coming with RHEL4.


> 
> Hope this helps,
>    Dave
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
-- 
Ming Zhang


@#$%^ purging memory... (*!%
http://blackmagic02881.wordpress.com/
http://www.linkedin.com/in/blackmagic02881
--------------------------------------------




More information about the Crash-utility mailing list