Em Fri, Jul 04, 2008 at 09:54:12AM +0200, Dennis Lubert escreveu:
> Am Donnerstag, den 03.07.2008, 14:08 -0300 schrieb Arnaldo Carvalho de Melo:
> > > - There could be some glob or regexp style substring match for types.
> > > >From the --help I thought that -i was for this, but I could not get it
> > > to match even on substrings... Am I maybe doing something wrong?
> > Regexps not supported yet, just prefixes:
> > [acme@doppio pahole]$ pahole --sizes --separator=, build/pahole | grep arg
> > argp_child,32,1
> > argp,56,0
> > argp_state,96,1
> > argp_option,48,2
> > [acme@doppio pahole]$ pahole --sizes --separator=, --exclude arg build/pahole | grep arg
> > [acme@doppio pahole]$
> Ah ok, just overlooked -y/-x ... but then I am a bit confused on what -i
> means. Giving it parts of the class, prefixes or even the whole name
> leads to no result here...
-i == --contains
[acme@doppio pahole]$ pahole -i tag build/pahole
parameter
ftype
lexblock
class_member
array_type
base_type
namespace
[acme@doppio pahole]$
Now lets look at some of these classes:
[acme@doppio pahole]$ pahole -C ftype build/pahole
struct ftype {
struct tag tag; /* 0 64 */
/* --- cacheline 1 boundary (64 bytes) --- */
struct list_head parms; /* 64 16 */
uint16_t nr_parms; /* 80 2 */
uint8_t unspec_parms; /* 82 1 */
/* size: 88, cachelines: 2, members: 4 */
/* padding: 5 */
/* last cacheline: 24 bytes */
};
[acme@doppio pahole]$ pahole -C class_member build/pahole
struct class_member {
struct tag tag; /* 0 64 */
/* --- cacheline 1 boundary (64 bytes) --- */
char * name; /* 64 8 */
uint32_t offset; /* 72 4 */
uint8_t bit_offset; /* 76 1 */
uint8_t bit_size; /* 77 1 */
uint8_t bit_hole; /* 78 1 */
uint8_t bitfield_end:1; /* 79: 7 1 */
uint8_t visited:1; /* 79: 6 1 */
uint8_t accessibility:2;/* 79: 4 1 */
uint8_t virtuality:2; /* 79: 2 1 */
/* XXX 2 bits hole, try to pack */
uint16_t hole; /* 80 2 */
/* size: 88, cachelines: 2, members: 11 */
/* bit holes: 1, sum bit holes: 2 bits */
/* padding: 6 */
/* last cacheline: 24 bytes */
};
[acme@doppio pahole]$ pahole -C parameter build/pahole
struct parameter {
struct tag tag; /* 0 64 */
/* --- cacheline 1 boundary (64 bytes) --- */
char * name; /* 64 8 */
Dwarf_Off abstract_origin;/* 72 8 */
/* size: 80, cachelines: 2, members: 3 */
/* last cacheline: 16 bytes */
};
See? All of these classes (structs) contains the specified class
(struct) "tag".
And if you specify --recursive together with -i/--contains you'll get
something more interesting:
[acme@doppio pahole]$ pahole --recursive --contains tag build/pahole
parameter
ftype
function
lexblock
function
class_member
array_type
base_type
namespace
type
class
[acme@doppio pahole]$
See? 'class' is-a 'type' is-a 'namespace' is-a 'tag'.
To see it more clearly use --expand_types:
[acme@doppio pahole]$ pahole -C class --expand_types build/pahole
struct class {
struct type {
struct namespace {
struct tag {
struct list_head {
struct list_head * next; /* 0 8 */
struct list_head * prev; /* 8 8 */
} node; /* 0 16 */
struct list_head {
struct list_head * next; /* 16 8 */
struct list_head * prev; /* 24 8 */
} hash_node; /* 16 16 */
/* typedef Dwarf_Off -> GElf_Off -> Elf64_Off -> uint64_t */ long unsigned int type; /* 32 8 */
/* typedef Dwarf_Off -> GElf_Off -> Elf64_Off -> uint64_t */ long unsigned int id; /* 40 8 */
const char * decl_file; /* 48 8 */
/* typedef uint16_t */ short unsigned int decl_line; /* 56 2 */
/* typedef uint16_t */ short unsigned int tag; /* 58 2 */
/* typedef uint16_t */ short unsigned int refcnt; /* 60 2 */
/* typedef uint16_t */ short unsigned int recursivity_level; /* 62 2 */
/* --- cacheline 1 boundary (64 bytes) --- */
} tag; /* 0 64 */
/* --- cacheline 1 boundary (64 bytes) --- */
const char * name; /* 64 8 */
struct list_head {
struct list_head * next; /* 72 8 */
struct list_head * prev; /* 80 8 */
} tags; /* 72 16 */
/* typedef uint16_t */ short unsigned int nr_tags; /* 88 2 */
} namespace; /* 0 96 */
/* XXX last struct has 6 bytes of padding */
/* --- cacheline 1 boundary (64 bytes) was 32 bytes ago --- */
struct list_head {
struct list_head * next; /* 96 8 */
struct list_head * prev; /* 104 8 */
} node; /* 96 16 */
/* typedef Dwarf_Off -> GElf_Off -> Elf64_Off -> uint64_t */ long unsigned int specification; /* 112 8 */
/* typedef size_t */ long unsigned int size; /* 120 8 */
/* --- cacheline 2 boundary (128 bytes) --- */
/* typedef size_t */ long unsigned int size_diff; /* 128 8 */
/* typedef uint16_t */ short unsigned int nr_members; /* 136 2 */
/* typedef uint8_t */ unsigned char declaration; /* 138 1 */
/* typedef uint8_t */ unsigned char definition_emitted:1; /* 139: 7 1 */
/* typedef uint8_t */ unsigned char fwd_decl_emitted:1; /* 139: 6 1 */
/* typedef uint8_t */ unsigned char resized:1; /* 139: 5 1 */
} type; /* 0 144 */
/* XXX last struct has 4 bytes of padding */
/* --- cacheline 2 boundary (128 bytes) was 16 bytes ago --- */
struct list_head {
struct list_head * next; /* 144 8 */
struct list_head * prev; /* 152 8 */
} vtable; /* 144 16 */
/* typedef uint16_t */ short unsigned int nr_vtable_entries; /* 160 2 */
/* typedef uint8_t */ unsigned char nr_holes; /* 162 1 */
/* typedef uint8_t */ unsigned char nr_bit_holes; /* 163 1 */
/* typedef uint16_t */ short unsigned int padding; /* 164 2 */
/* typedef uint8_t */ unsigned char bit_padding; /* 166 1 */
/* XXX 1 byte hole, try to pack */
void * priv; /* 168 8 */
/* size: 176, cachelines: 3, members: 8 */
/* sum members: 175, holes: 1, sum holes: 1 */
/* paddings: 1, sum paddings: 4 */
/* last cacheline: 48 bytes */
};
Try --expand_pointers at home, say on struct task_struct on the Linux
kernel 8-)
For the lazy ones:
[acme@doppio pahole]$ pahole -C task_struct --expand_types --expand_pointers vmlinux >
http://oops.ghostprotocols.net/dwarves/pahole/vmlinux-expand_pointers-task_struct.txt
http://vger.kernel.org/~acme/vmlinux-expand_pointers-task_struct.txt
- Arnaldo
--
To unsubscribe from this list: send the line "unsubscribe dwarves" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
[Linux USB Devel]
[Video for Linux]
[Linux Audio Users]
[Photo]
[Yosemite News]
[Yosemite Photos]
[Free Online Dating]
[Linux Kernel]
[Linux SCSI]
[XFree86]