* pahole and parsing data: --count
[not found] ` <0eae329c-d448-4d04-c240-0850a93278a5-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
@ 2020-07-01 11:25 ` Arnaldo Carvalho de Melo
[not found] ` <20200701112534.GQ29008-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
0 siblings, 1 reply; 3+ messages in thread
From: Arnaldo Carvalho de Melo @ 2020-07-01 11:25 UTC (permalink / raw)
To: dwarves-u79uwXL29TY76Z2rM5mHXA; +Cc: Joe Lawrence
Hi,
I've been implementing pretty printing in pahole:
[acme@quaco pahole]$ git log --oneline v1.17..
5631fdcea1bb (HEAD -> master, acme.korg/pretty, acme.korg/master) pahole: Introduce --count, just like dd's
272bc75024b4 man-pages: Add information about stdin raw data pretty printing
66835f9e190c pahole: Add support for base type arrays
1a67d6e70090 pahole: Factor out base_type__fprintf_value()
6fb98aa1209f pahole: Support char arrays when dumping from stdin
a231d00f8d08 pahole: Print comma at the end of field name + field value
1b2cdda38c0a dwarves: Introduce tag__is_array()
a83313fb2252 pahole: Pretty print base types in structs from stdin
cc65946e3068 dwarves: Adopt tag__is_base_type() from ctrace.c
d8079c6d373a pahole: Hex dump a type from stdio when it isn't a tty
38109ab45fe0 spec: Fix date
[acme@quaco pahole]$
The latest changeset shows what this is about, see its example
below, please help testing and suggesting whatever needs you have
regarding pretty printing.
Now to implement --skip.
Regards,
- Arnaldo
From 5631fdcea1bbe2bcb8c673ff0bb0fdc9fdc2875d Mon Sep 17 00:00:00 2001
From: Arnaldo Carvalho de Melo <acme-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Date: Wed, 1 Jul 2020 08:14:58 -0300
Subject: [PATCH] pahole: Introduce --count, just like dd's
$ objcopy -O binary --only-section=.altinstructions ~/git/build/v5.7-rc2+/vmlinux .altinstructions
$ pahole --count 2 alt_instr < .altinstructions
{
.instr_offset = 0xffffffffffe0e690,
.repl_offset = 0x4873,
.cpuid = 0x70,
.instrlen = 0x5,
.replacementlen = 0x5,
.padlen = 0,
},
{
.instr_offset = 0xffffffffffe0e683,
.repl_offset = 0x486b,
.cpuid = 0x129,
.instrlen = 0x5,
.replacementlen = 0x5,
.padlen = 0,
},
$
Signed-off-by: Arnaldo Carvalho de Melo <acme-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
---
dwarves.h | 2 ++
man-pages/pahole.1 | 8 +++++++-
pahole.c | 13 +++++++++++++
3 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/dwarves.h b/dwarves.h
index 0170f251bcd4..f224d05b28c3 100644
--- a/dwarves.h
+++ b/dwarves.h
@@ -54,6 +54,7 @@ struct conf_load {
/** struct conf_fprintf - hints to the __fprintf routines
*
+ * @count - Just like 'dd', stop pretty printing input after 'count' records
* @flat_arrays - a->foo[10][2] becomes a->foo[20]
* @classes_as_structs - class f becomes struct f, CTF doesn't have a "class"
* @cachelinep - pointer to current cacheline, so that when expanding types we keep track of it,
@@ -68,6 +69,7 @@ struct conf_fprintf {
int32_t type_spacing;
int32_t name_spacing;
uint32_t base_offset;
+ uint32_t count;
uint32_t *cachelinep;
uint8_t indent;
uint8_t expand_types:1;
diff --git a/man-pages/pahole.1 b/man-pages/pahole.1
index 26c14cb6fd2c..7e8207756432 100644
--- a/man-pages/pahole.1
+++ b/man-pages/pahole.1
@@ -60,6 +60,8 @@ See the EXAMPLES section for more usage suggestions.
It also pretty prints whatever is fed to its standard input, according to the
type specified, see the EXAMPLE session.
+Use --count to state how many records should be pretty printed.
+
.SH OPTIONS
pahole supports the following options.
@@ -72,6 +74,10 @@ or file URLs (e.g.: file://class_list.txt)
.B \-c, \-\-cacheline_size=SIZE
Set cacheline size to SIZE bytes.
+.TP
+.B \-\-count=COUNT
+Pretty print the first COUNT records from input.
+
.TP
.B \-E, \-\-expand_types
Expand class members. Useful to find in what member of inner structs where an
@@ -482,7 +488,7 @@ $
$ ls -la versions
-rw-rw-r--. 1 acme acme 7616 Jun 25 11:33 versions
$
-$ pahole -C modversion_info drivers/scsi/sg.ko < versions | head -12
+$ pahole --count 3 -C modversion_info drivers/scsi/sg.ko < versions
{
.crc = 0x8dabd84,
.name = "module_layout",
diff --git a/pahole.c b/pahole.c
index 03909525bf15..1b84f5c2fa4a 100644
--- a/pahole.c
+++ b/pahole.c
@@ -802,6 +802,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version;
#define ARGP_suppress_packed 308
#define ARGP_just_unions 309
#define ARGP_just_structs 310
+#define ARGP_count 311
static const struct argp_option pahole__options[] = {
{
@@ -822,6 +823,12 @@ static const struct argp_option pahole__options[] = {
.arg = "CLASS_NAME",
.doc = "Show just this class"
},
+ {
+ .name = "count",
+ .key = ARGP_count,
+ .arg = "COUNT",
+ .doc = "Print only COUNT input records"
+ },
{
.name = "find_pointers_to",
.key = 'f',
@@ -1145,6 +1152,8 @@ static error_t pahole__options_parser(int key, char *arg,
just_unions = true; break;
case ARGP_just_structs:
just_structs = true; break;
+ case ARGP_count:
+ conf.count = atoi(arg); break;
default:
return ARGP_ERR_UNKNOWN;
}
@@ -1315,6 +1324,7 @@ static int tag__stdio_fprintf_value(struct tag *type, struct cu *cu, FILE *fp)
{
int _sizeof = tag__size(type, cu), printed = 0;
void *instance = malloc(_sizeof);
+ uint32_t count = 0;
if (instance == NULL)
return -ENOMEM;
@@ -1322,6 +1332,9 @@ static int tag__stdio_fprintf_value(struct tag *type, struct cu *cu, FILE *fp)
while (fread(instance, _sizeof, 1, stdin) == 1) {
printed += tag__fprintf_value(type, cu, instance, _sizeof, fp);
printed += fprintf(fp, ",\n");
+
+ if (conf.count && ++count == conf.count)
+ break;
}
return printed;
--
2.21.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
* pahole and parsing data: --skip
[not found] ` <20200701112534.GQ29008-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
@ 2020-07-01 11:44 ` Arnaldo Carvalho de Melo
[not found] ` <20200701114421.GR29008-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
0 siblings, 1 reply; 3+ messages in thread
From: Arnaldo Carvalho de Melo @ 2020-07-01 11:44 UTC (permalink / raw)
To: dwarves-u79uwXL29TY76Z2rM5mHXA; +Cc: Joe Lawrence, Jiri Olsa, Namhyung Kim
Em Wed, Jul 01, 2020 at 08:25:34AM -0300, Arnaldo Carvalho de Melo escreveu:
> The latest changeset shows what this is about, see its example
> below, please help testing and suggesting whatever needs you have
> regarding pretty printing.
>
> Now to implement --skip.
Now to implement --seek, this time in bytes, so that we can, for
instance, pretty print perf.data records, looking at 'perf report -D'
and getting the offset of the start of a series of 'struct
perf_event_attr' or 'struct perf_event_header'.
- Arnaldo
commit 44af7c02b5d0a7f2b93fab9fda45907cd6fe0827
Author: Arnaldo Carvalho de Melo <acme-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Date: Wed Jul 1 08:36:28 2020 -0300
pahole: Implement --skip, just like dd
$ objcopy -O binary --only-section=__versions drivers/scsi/sg.ko versions
$ pahole -C modversion_info drivers/scsi/sg.ko
struct modversion_info {
long unsigned int crc; /* 0 8 */
char name[56]; /* 8 56 */
/* size: 64, cachelines: 1, members: 2 */
};
$ pahole --count 3 -C modversion_info drivers/scsi/sg.ko < versions
{
.crc = 0x8dabd84,
.name = "module_layout",
},
{
.crc = 0x45e4617b,
.name = "no_llseek",
},
{
.crc = 0xa23fae8c,
.name = "param_ops_int",
},
$ pahole --skip 1 --count 2 -C modversion_info drivers/scsi/sg.ko < versions
{
.crc = 0x45e4617b,
.name = "no_llseek",
},
{
.crc = 0xa23fae8c,
.name = "param_ops_int",
},
$
Signed-off-by: Arnaldo Carvalho de Melo <acme-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
diff --git a/dwarves.h b/dwarves.h
index f224d05b28c3..24f9c7c37843 100644
--- a/dwarves.h
+++ b/dwarves.h
@@ -55,6 +55,7 @@ struct conf_load {
/** struct conf_fprintf - hints to the __fprintf routines
*
* @count - Just like 'dd', stop pretty printing input after 'count' records
+ * @skip - Just like 'dd', skip 'count' records when pretty printing input
* @flat_arrays - a->foo[10][2] becomes a->foo[20]
* @classes_as_structs - class f becomes struct f, CTF doesn't have a "class"
* @cachelinep - pointer to current cacheline, so that when expanding types we keep track of it,
@@ -71,6 +72,7 @@ struct conf_fprintf {
uint32_t base_offset;
uint32_t count;
uint32_t *cachelinep;
+ uint32_t skip;
uint8_t indent;
uint8_t expand_types:1;
uint8_t expand_pointers:1;
diff --git a/man-pages/pahole.1 b/man-pages/pahole.1
index 7e8207756432..db820cca323f 100644
--- a/man-pages/pahole.1
+++ b/man-pages/pahole.1
@@ -78,6 +78,10 @@ Set cacheline size to SIZE bytes.
.B \-\-count=COUNT
Pretty print the first COUNT records from input.
+.TP
+.B \-\-skip=COUNT
+Skip COUNT input records.
+
.TP
.B \-E, \-\-expand_types
Expand class members. Useful to find in what member of inner structs where an
@@ -502,6 +506,16 @@ $ pahole --count 3 -C modversion_info drivers/scsi/sg.ko < versions
.name = "param_ops_int",
},
$
+$ pahole --skip 1 --count 2 -C modversion_info drivers/scsi/sg.ko < versions
+{
+ .crc = 0x45e4617b,
+ .name = "no_llseek",
+},
+{
+ .crc = 0xa23fae8c,
+ .name = "param_ops_int",
+},
+$
.fi
.P
diff --git a/pahole.c b/pahole.c
index 1b84f5c2fa4a..7d8431c64423 100644
--- a/pahole.c
+++ b/pahole.c
@@ -803,6 +803,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version;
#define ARGP_just_unions 309
#define ARGP_just_structs 310
#define ARGP_count 311
+#define ARGP_skip 312
static const struct argp_option pahole__options[] = {
{
@@ -829,6 +830,12 @@ static const struct argp_option pahole__options[] = {
.arg = "COUNT",
.doc = "Print only COUNT input records"
},
+ {
+ .name = "skip",
+ .key = ARGP_skip,
+ .arg = "COUNT",
+ .doc = "Skip COUNT input records"
+ },
{
.name = "find_pointers_to",
.key = 'f',
@@ -1154,6 +1161,8 @@ static error_t pahole__options_parser(int key, char *arg,
just_structs = true; break;
case ARGP_count:
conf.count = atoi(arg); break;
+ case ARGP_skip:
+ conf.skip = atoi(arg); break;
default:
return ARGP_ERR_UNKNOWN;
}
@@ -1325,11 +1334,17 @@ static int tag__stdio_fprintf_value(struct tag *type, struct cu *cu, FILE *fp)
int _sizeof = tag__size(type, cu), printed = 0;
void *instance = malloc(_sizeof);
uint32_t count = 0;
+ uint32_t skip = conf.skip;
if (instance == NULL)
return -ENOMEM;
while (fread(instance, _sizeof, 1, stdin) == 1) {
+ if (skip) {
+ --skip;
+ continue;
+ }
+
printed += tag__fprintf_value(type, cu, instance, _sizeof, fp);
printed += fprintf(fp, ",\n");
^ permalink raw reply related [flat|nested] 3+ messages in thread
* pahole and parsing data: --seek_bytes, dissecting perf.data files
[not found] ` <20200701114421.GR29008-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
@ 2020-07-01 12:46 ` Arnaldo Carvalho de Melo
0 siblings, 0 replies; 3+ messages in thread
From: Arnaldo Carvalho de Melo @ 2020-07-01 12:46 UTC (permalink / raw)
To: dwarves-u79uwXL29TY76Z2rM5mHXA
Cc: Joe Lawrence, Jiri Olsa, Namhyung Kim, Andrii Nakryiko, Song Liu
Em Wed, Jul 01, 2020 at 08:44:21AM -0300, Arnaldo Carvalho de Melo escreveu:
> Em Wed, Jul 01, 2020 at 08:25:34AM -0300, Arnaldo Carvalho de Melo escreveu:
> > The latest changeset shows what this is about, see its example
> > below, please help testing and suggesting whatever needs you have
> > regarding pretty printing.
> >
> > Now to implement --skip.
> Now to implement --seek, this time in bytes, so that we can, for
> instance, pretty print perf.data records, looking at 'perf report -D'
> and getting the offset of the start of a series of 'struct
> perf_event_attr' or 'struct perf_event_header'.
Here it is with more complex examples dissecting perf.data file data
structures, including BPF related structs:
commit fe284221448c950d2ba17bce91d19c484d6580a0
Author: Arnaldo Carvalho de Melo <acme-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Date: Wed Jul 1 09:17:38 2020 -0300
pahole: Introduce --seek_bytes
Works with stdio, will work with files where we'll use plain lseek and
allow for pretty printing trailer structs.
E.g.:
$ objcopy -O binary --only-section=__versions drivers/scsi/sg.ko versions
$ pahole -C modversion_info drivers/scsi/sg.ko
struct modversion_info {
long unsigned int crc; /* 0 8 */
char name[56]; /* 8 56 */
/* size: 64, cachelines: 1, members: 2 */
};
$ pahole --count 2 -C modversion_info drivers/scsi/sg.ko < versions
{
.crc = 0x8dabd84,
.name = "module_layout",
},
{
.crc = 0x45e4617b,
.name = "no_llseek",
},
$ pahole --skip 1 --count 1 -C modversion_info drivers/scsi/sg.ko < versions
{
.crc = 0x45e4617b,
.name = "no_llseek",
},
Then the equivalent, skipping sizeof(modversion_info) explicitely:
$ pahole --seek_bytes 64 --count 1 -C modversion_info drivers/scsi/sg.ko < versions
{
.crc = 0x45e4617b,
.name = "no_llseek",
},
$
Using a perf.data file generated by 'perf record':
$ perf report -D | head -18
# To display the perf.data header info, please use --header/--header-only options.
#
0x130 [0x20]: event: 79
.
. ... raw event: size 32 bytes
. 0000: 4f 00 00 00 00 00 20 00 1f 00 00 00 00 00 00 00 O..... .........
. 0010: 31 30 9b 3c 00 00 00 00 2e 53 f8 0c 52 8c 01 00 10.<.....S�.R...
0 0x130 [0x20]: PERF_RECORD_TIME_CONV: unhandled!
0x150 [0x28]: event: 73
.
. ... raw event: size 40 bytes
. 0000: 49 00 00 00 00 00 28 00 01 00 00 00 00 00 00 00 I.....(.........
. 0010: 50 7e 00 00 00 00 00 00 00 00 00 00 00 00 00 00 P~..............
. 0020: 00 00 00 00 00 00 00 00 ........
$ pahole --seek_bytes 0x130 --count 1 -C perf_event_header < perf.data
{
.type = 0x4f,
.misc = 0,
.size = 0x20,
},
$ printf "0x%x\n" 79
0x4f
$ pahole --seek_bytes 0x150 --count 1 -C perf_event_header < perf.data
{
.type = 0x49,
.misc = 0,
.size = 0x28,
},
$ printf "0x%x\n" 73
0x49
$
Now to use more complex types, again using perf.data files.
# perf record -a sleep 1
[ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 3.834 MB perf.data (31853 samples) ]
# perf report -D | grep -m1 -B20 PERF_RECORD_BPF
0x6aa0 [0x58]: event: 17
.
. ... raw event: size 88 bytes
. 0020: 5f 37 62 65 34 39 65 33 39 33 34 61 31 32 35 62 _7be49e3934a125b
. 0030: 61 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 a...............
. 0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
. 0050: 00 00 00 00 00 00 00 00 ........
0 0 0x6aa0 [0x58]: PERF_RECORD_KSYMBOL addr ffffffffc03e0e90 len 203 type 1 flags 0x0 name bpf_prog_7be49e3934a125ba
0x6af8 [0x38]: event: 18
.
. ... raw event: size 56 bytes
. 0000: 12 00 00 00 00 00 38 00 01 00 00 00 11 00 00 00 ......8.........
. 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
. 0030: 00 00 00 00 00 00 00 00 ........
0 0 0x6af8 [0x38]: PERF_RECORD_BPF_EVENT type 1, flags 0, id 17
Binary file (standard input) matches
# pahole -C perf_record_bpf_event ~/bin/perf
struct perf_record_bpf_event {
struct perf_event_header header; /* 0 8 */
__u16 type; /* 8 2 */
__u16 flags; /* 10 2 */
__u32 id; /* 12 4 */
__u8 tag[8]; /* 16 8 */
/* size: 24, cachelines: 1, members: 5 */
/* last cacheline: 24 bytes */
};
# pahole -C perf_record_bpf_event --seek_bytes 0x6af8 --count 1 ~/bin/perf < perf.data
{
.header = 0x12 0x00 0x00 0x00 0x00 0x00 0x38 0x00,
.type = 0x1,
.flags = 0,
.id = 0x11,
.tag = { 0, 0, 0, 0, 0, 0, 0, 0},
},
# printf "0x%x\n" 18
0x12
# pahole -C perf_record_ksymbol ~/bin/perf
struct perf_record_ksymbol {
struct perf_event_header header; /* 0 8 */
__u64 addr; /* 8 8 */
__u32 len; /* 16 4 */
__u16 ksym_type; /* 20 2 */
__u16 flags; /* 22 2 */
char name[256]; /* 24 256 */
/* size: 280, cachelines: 5, members: 6 */
/* last cacheline: 24 bytes */
};
# pahole -C perf_record_ksymbol --seek_bytes 0x6aa0 --count 1 ~/bin/perf < perf.data
{
.header = 0x11 0x00 0x00 0x00 0x00 0x00 0x58 0x00,
.addr = 0xffffffffc03e0e90,
.len = 0xcb,
.ksym_type = 0x1,
.flags = 0,
.name = "bpf_prog_7be49e3934a125ba",
},
# printf "0x%x\n" 17
0x11
#
Need to recursively pretty print substructs, but all seems to work with
the simple hexdump.
Signed-off-by: Arnaldo Carvalho de Melo <acme-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
diff --git a/dwarves.h b/dwarves.h
index 24f9c7c37843..1b118d03ec15 100644
--- a/dwarves.h
+++ b/dwarves.h
@@ -13,6 +13,7 @@
#include <obstack.h>
#include <dwarf.h>
#include <elfutils/libdwfl.h>
+#include <sys/types.h>
#include "dutil.h"
#include "list.h"
@@ -56,6 +57,7 @@ struct conf_load {
*
* @count - Just like 'dd', stop pretty printing input after 'count' records
* @skip - Just like 'dd', skip 'count' records when pretty printing input
+ * @seek_bytes - Number of bytes to seek, if stdin only from start, when we have --pretty FILE, then from the end as well with negative numbers
* @flat_arrays - a->foo[10][2] becomes a->foo[20]
* @classes_as_structs - class f becomes struct f, CTF doesn't have a "class"
* @cachelinep - pointer to current cacheline, so that when expanding types we keep track of it,
@@ -72,6 +74,7 @@ struct conf_fprintf {
uint32_t base_offset;
uint32_t count;
uint32_t *cachelinep;
+ off_t seek_bytes;
uint32_t skip;
uint8_t indent;
uint8_t expand_types:1;
diff --git a/man-pages/pahole.1 b/man-pages/pahole.1
index db820cca323f..ad4e92d716cf 100644
--- a/man-pages/pahole.1
+++ b/man-pages/pahole.1
@@ -516,6 +516,14 @@ $ pahole --skip 1 --count 2 -C modversion_info drivers/scsi/sg.ko < versions
.name = "param_ops_int",
},
$
+This is equivalent to:
+
+$ pahole --seek_bytes 64 --count 1 -C modversion_info drivers/scsi/sg.ko < versions
+{
+ .crc = 0x45e4617b,
+ .name = "no_llseek",
+},
+$
.fi
.P
diff --git a/pahole.c b/pahole.c
index 7d8431c64423..245a3f2f14f7 100644
--- a/pahole.c
+++ b/pahole.c
@@ -3,7 +3,7 @@
Copyright (C) 2006 Mandriva Conectiva S.A.
Copyright (C) 2006 Arnaldo Carvalho de Melo <acme-4qZELD6FgxhWk0Htik3J/w@public.gmane.org>
- Copyright (C) 2007-2008 Arnaldo Carvalho de Melo <acme-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
+ Copyright (C) 2007- Arnaldo Carvalho de Melo <acme-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
*/
#include <argp.h>
@@ -804,6 +804,7 @@ ARGP_PROGRAM_VERSION_HOOK_DEF = dwarves_print_version;
#define ARGP_just_structs 310
#define ARGP_count 311
#define ARGP_skip 312
+#define ARGP_seek_bytes 313
static const struct argp_option pahole__options[] = {
{
@@ -836,6 +837,12 @@ static const struct argp_option pahole__options[] = {
.arg = "COUNT",
.doc = "Skip COUNT input records"
},
+ {
+ .name = "seek_bytes",
+ .key = ARGP_seek_bytes,
+ .arg = "BYTES",
+ .doc = "Seek COUNT input records"
+ },
{
.name = "find_pointers_to",
.key = 'f',
@@ -1163,6 +1170,8 @@ static error_t pahole__options_parser(int key, char *arg,
conf.count = atoi(arg); break;
case ARGP_skip:
conf.skip = atoi(arg); break;
+ case ARGP_seek_bytes:
+ conf.seek_bytes = strtol(arg, NULL, 0); break;
default:
return ARGP_ERR_UNKNOWN;
}
@@ -1329,6 +1338,25 @@ static int tag__fprintf_value(struct tag *type, struct cu *cu, void *instance, i
return tag__fprintf_hexdump_value(type, cu, instance, _sizeof, fp);
}
+static int pipe_seek(FILE *fp, off_t offset)
+{
+ char bf[4096];
+ int chunk = sizeof(bf);
+
+ if (chunk > offset)
+ chunk = offset;
+
+ while (fread(bf, chunk, 1, stdin) == 1) {
+ offset -= chunk;
+ if (offset == 0)
+ return 0;
+ if (chunk > offset)
+ chunk = offset;
+ }
+
+ return offset == 0 ? 0 : -1;
+}
+
static int tag__stdio_fprintf_value(struct tag *type, struct cu *cu, FILE *fp)
{
int _sizeof = tag__size(type, cu), printed = 0;
@@ -1339,6 +1367,12 @@ static int tag__stdio_fprintf_value(struct tag *type, struct cu *cu, FILE *fp)
if (instance == NULL)
return -ENOMEM;
+ if (conf.seek_bytes && pipe_seek(stdin, conf.seek_bytes) < 0) {
+ int err = --errno;
+ fprintf(stderr, "Couldn't --seek_bytes %ld\n", conf.seek_bytes);
+ return err;
+ }
+
while (fread(instance, _sizeof, 1, stdin) == 1) {
if (skip) {
--skip;
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2020-07-01 12:46 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
[not found] <20200623165646.GA2251@redhat.com>
[not found] ` <e52cf45d-311f-85c7-d358-5592d3666092@redhat.com>
[not found] ` <20200624173038.GC20203@kernel.org>
[not found] ` <20200624185748.GA16165@redhat.com>
[not found] ` <20200624190716.GA4139@redhat.com>
[not found] ` <a5238972-e36e-3abe-aa14-5dcca58c46fb@redhat.com>
[not found] ` <20200625113816.GA29008@kernel.org>
[not found] ` <20200625114129.GB29008@kernel.org>
[not found] ` <20200625160326.GA10325@kernel.org>
[not found] ` <0eae329c-d448-4d04-c240-0850a93278a5@redhat.com>
[not found] ` <0eae329c-d448-4d04-c240-0850a93278a5-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2020-07-01 11:25 ` pahole and parsing data: --count Arnaldo Carvalho de Melo
[not found] ` <20200701112534.GQ29008-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2020-07-01 11:44 ` pahole and parsing data: --skip Arnaldo Carvalho de Melo
[not found] ` <20200701114421.GR29008-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2020-07-01 12:46 ` pahole and parsing data: --seek_bytes, dissecting perf.data files Arnaldo Carvalho de Melo
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.