On Mon, Apr 12, 2021 at 4:01 PM Stephen Röttger wrote: > From: Stephen Roettger > > When calling `maintenance btrace packet-history` or `maintenance info > btrace`, > the commands wouldn't show any data unless it was updated previously by > some > other means, for example by running `info record`. > To fix this, use the require_btrace function from record-brace.h which > will update the data before returning the btrace_thread_info pointer. > > Here's an example of the issue: > ``` > $ gdb -nx /usr/bin/ls > (gdb) break malloc > Breakpoint 1 at 0x46c8 > (gdb) run > Starting program: /usr/bin/ls > > Breakpoint 1, 0x00007ffff7fec240 in malloc () from > /lib64/ld-linux-x86-64.so.2 > (gdb) record btrace bts > (gdb) c > Continuing. > > Breakpoint 1, 0x00007ffff7fec240 in malloc () from > /lib64/ld-linux-x86-64.so.2 > (gdb) maintenance btrace packet-history > No trace. > (gdb) maintenance info btrace > Format: Branch Trace Store. > Aborted > ``` > > gdb/ChangeLog: > > * btrace.c (maint_btrace_packet_history_cmd): use require_btrace > (maint_info_btrace_cmd): use require_btrace > * record-btrace.c (struct btrace_thread_info): mark non-static > * record-btrace.h (require_btrace): export function > > --- > gdb/btrace.c | 13 ++----------- > gdb/record-btrace.c | 2 +- > gdb/record-btrace.h | 7 +++++++ > 3 files changed, 10 insertions(+), 12 deletions(-) > > diff --git a/gdb/btrace.c b/gdb/btrace.c > index c697f37f46c..177e818f0cf 100644 > --- a/gdb/btrace.c > +++ b/gdb/btrace.c > @@ -3231,12 +3231,8 @@ maint_btrace_packet_history_cmd (const char *arg, > int from_tty) > struct btrace_thread_info *btinfo; > unsigned int size, begin, end, from, to; > > - thread_info *tp = find_thread_ptid (current_inferior (), inferior_ptid); > - if (tp == NULL) > - error (_("No thread.")); > - > + btinfo = require_btrace (); > size = 10; > - btinfo = &tp->btrace; > > btrace_maint_update_packets (btinfo, &begin, &end, &from, &to); > if (begin == end) > @@ -3372,12 +3368,7 @@ maint_info_btrace_cmd (const char *args, int > from_tty) > if (args != NULL && *args != 0) > error (_("Invalid argument.")); > > - if (inferior_ptid == null_ptid) > - error (_("No thread.")); > - > - thread_info *tp = inferior_thread (); > - > - btinfo = &tp->btrace; > + btinfo = require_btrace (); > > conf = btrace_conf (btinfo); > if (conf == NULL) > diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c > index b7b3c91f85d..79a6e47a4a6 100644 > --- a/gdb/record-btrace.c > +++ b/gdb/record-btrace.c > @@ -269,7 +269,7 @@ require_btrace_thread (void) > Throws an error if there is no thread or no trace. This function never > returns NULL. */ > > -static struct btrace_thread_info * > +struct btrace_thread_info * > require_btrace (void) > { > struct thread_info *tp; > diff --git a/gdb/record-btrace.h b/gdb/record-btrace.h > index 8e7bbd90e60..b56e720e5a5 100644 > --- a/gdb/record-btrace.h > +++ b/gdb/record-btrace.h > @@ -29,4 +29,11 @@ extern void record_btrace_push_target (void); > NULL if the cpu was configured as auto. */ > extern const struct btrace_cpu *record_btrace_get_cpu (void); > > +/* Update the branch trace for the current thread and return a pointer to > its > + branch trace information struct. > + > + Throws an error if there is no thread or no trace. This function never > + returns NULL. */ > +extern struct btrace_thread_info * require_btrace (void); > + > #endif /* RECORD_BTRACE_H */ > -- > 2.31.1.295.g9ea45b61b8-goog > >