From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4966 invoked by alias); 11 May 2012 00:25:21 -0000 Received: (qmail 4952 invoked by uid 22791); 11 May 2012 00:25:18 -0000 X-SWARE-Spam-Status: No, hits=-4.7 required=5.0 tests=AWL,BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,KHOP_RCVD_TRUST,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE X-Spam-Check-By: sourceware.org Received: from mail-vb0-f41.google.com (HELO mail-vb0-f41.google.com) (209.85.212.41) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 11 May 2012 00:25:04 +0000 Received: by vbbey12 with SMTP id ey12so2749307vbb.0 for ; Thu, 10 May 2012 17:25:03 -0700 (PDT) Received: by 10.220.141.84 with SMTP id l20mr1486933vcu.31.1336695903531; Thu, 10 May 2012 17:25:03 -0700 (PDT) MIME-Version: 1.0 Received: by 10.223.15.154 with HTTP; Thu, 10 May 2012 17:24:23 -0700 (PDT) In-Reply-To: <1336662810-21937-1-git-send-email-markus.t.metzger@intel.com> References: <1336662810-21937-1-git-send-email-markus.t.metzger@intel.com> From: Hui Zhu Date: Fri, 11 May 2012 00:25:00 -0000 Message-ID: Subject: Re: [PATCH 00/16] branch tracing support To: markus.t.metzger@intel.com Cc: gdb-patches@sourceware.org, markus.t.metzger@gmail.com Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2012-05/txt/msg00395.txt.bz2 Hi Markus, Thanks for your work. I think this function is very interesting. But I didn't find the patch for the doc in your patches list. I suggest you add it. PS, do you have any data about how much speed decrease when btrace enable. Thanks, Hui On Thu, May 10, 2012 at 11:13 PM, wrote: > From: Markus Metzger > > IA hardware offers a feature called Branch Trace Store (BTS) that stores = a log > of branches into an OS provided ring buffer. > > Linux supports this feature since 2.6.32 as part of the perf_event interf= ace. > > Branch tracing is very useful to debug problems that do not immediatly re= sult in > a crash. It is particularly useful for bugs that make other debugger feat= ures > fail, e.g. a corrupted stack that breaks unwinding. > > In comparison with reverse debugging, branch tracing is less powerful but > faster. In addition, the list view (see below) provides a quick overview = of > where you are, comparable with the backtrace command. > > This series adds commands to enable/disable branch tracing as well as to = display > the recorded trace: > > =A0- "btrace enable/disable" perform the obvious operation > > =A0 =A0They accept an optional range argument specifying the range of thr= eads to > =A0 =A0enable/disable branch tracing for. If no argument is given, they t= arget the > =A0 =A0current thread. > > =A0 =A0They further accept the following arguments: > > =A0 =A0 =A0all =A0 =A0targets all threads > =A0 =A0 =A0auto =A0 turns automatic enabling for new threads on/off > > =A0- "btrace list" prints the blocks that have been traced; one line per = block. > > =A0 =A0The output may be configured using modifiers (default: /fl). It pr= ints: > =A0 =A0 =A0 =A0 the block number > =A0 =A0 =A0/a the begin and end code address of that block > =A0 =A0 =A0/f the function containing the block > =A0 =A0 =A0/l the source lines contained in the block > > =A0 =A0It accepts an optional range argument specifying the range of bloc= ks to be > =A0 =A0listed. If no argument is given, all blocks are listed. > > =A0 =A0Blocks are ordered from newest to oldest; block 1 always contains = the > =A0 =A0current location. > > =A0 =A0 =A0(gdb) btrace list 24-34 > =A0 =A0 =A024 =A0 =A0 in stdio_file_flush () at ../../../git/gdb/ui-file.= c:525-529 > =A0 =A0 =A025 =A0 =A0 in ui_file_data () at ../../../git/gdb/ui-file.c:17= 5-180 > =A0 =A0 =A026 =A0 =A0 in stdio_file_flush () at ../../../git/gdb/ui-file.= c:522-523 > =A0 =A0 =A027 =A0 =A0 in gdb_flush () at ../../../git/gdb/ui-file.c:185 > =A0 =A0 =A028 =A0 =A0 in gdb_wait_for_event () at ../../../git/gdb/event-= loop.c:840-847 > =A0 =A0 =A029 =A0 =A0 in gdb_do_one_event () at ../../../git/gdb/event-lo= op.c:461 > =A0 =A0 =A030 =A0 =A0 in gdb_do_one_event () at ../../../git/gdb/event-lo= op.c:453 > =A0 =A0 =A031 =A0 =A0 in process_event () at ../../../git/gdb/event-loop.= c:407 > =A0 =A0 =A032 =A0 =A0 in process_event () at ../../../git/gdb/event-loop.= c:361-367 > =A0 =A0 =A033 =A0 =A0 in process_event () at ../../../git/gdb/event-loop.= c:1041-1043 > =A0 =A0 =A034 =A0 =A0 in process_event () at ../../../git/gdb/event-loop.= c:1041-1045 > > =A0- "btrace" prints the branch trace disassembly > > =A0 =A0Branch trace is printed block-by-block. Typically, one block at a = time is > =A0 =A0printed. Repeated commands will iterate over all blocks similar to= the list > =A0 =A0command. > > =A0 =A0It supports the /m and /r modifiers accepted by the disassemble co= mmand. > > =A0 =A0It accepts an optional range argument specifying the range of bloc= ks to be > =A0 =A0printed. If more than one block is given, blocks are printed in re= verse > =A0 =A0order to preserve the original control flow. > > =A0 =A0 =A0(gdb) btrace /m 25 > =A0 =A0 =A0../../../git/gdb/ui-file.c:175 =A0 =A0{ > =A0 =A0 =A0 =A0 0x0000000000635410 : =A0 sub =A0 =A0$0x8,= %rsp > > =A0 =A0 =A0../../../git/gdb/ui-file.c:176 =A0 =A0 =A0if (file->magic !=3D= &ui_file_magic) > =A0 =A0 =A0 =A0 0x0000000000635414 : =A0 cmpq =A0 $0xb33b= 94,(%rdi) > =A0 =A0 =A0 =A0 0x000000000063541b : =A0jne =A0 =A00x635= 426 > > =A0 =A0 =A0../../../git/gdb/ui-file.c:177 =A0 =A0 =A0 =A0internal_error (= __FILE__, __LINE__, > =A0 =A0 =A0 =A0 0x000000000063541d : =A0mov =A0 =A00x50(= %rdi),%rax > > =A0 =A0 =A0../../../git/gdb/ui-file.c:178 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0_("ui_file_data: bad magic number")); > =A0 =A0 =A0../../../git/gdb/ui-file.c:179 =A0 =A0 =A0return file->to_data; > =A0 =A0 =A0../../../git/gdb/ui-file.c:180 =A0 =A0} > =A0 =A0 =A0 =A0 0x0000000000635421 : =A0add =A0 =A0$0x8,= %rsp > =A0 =A0 =A0 =A0 0x0000000000635425 : =A0retq > > =A0 =A0Mixed source and disassembly does not work very well for inlined f= unctions, > =A0 =A0a problem that it shares with the disassemble command. > > Barkha Ahuja (1): > =A0test, btrace: more branch tracing tests > > Markus Metzger (15): > =A0disas: add precise instructions flag > =A0source: add flags to print_source_lines () > =A0source, disasm: optionally prefix source lines with filename > =A0thread, btrace: add generic branch trace support > =A0cli, btrace: add btrace cli > =A0configure: add check for perf_event header > =A0configure: autoreconf > =A0linux, btrace: perf_event based branch tracing > =A0btrace, linux: add linux native btrace target ops > =A0btrace, config: enable btrace for 32bit and 64bit linux native > =A0test, btrace: add branch trace tests > =A0xml, btrace: define btrace xml document style > =A0remote, btrace: add branch trace remote ops > =A0gdbserver, btrace: add generic btrace support > =A0gdbserver, linux, btrace: add btrace support for linux-low > > =A0.gitignore =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 =A0 =A0 =A0 | =A0 =A02 + > =A0gdb/Makefile.in =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0| =A0 14 +- > =A0gdb/amd64-linux-nat.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0| =A0 =A02 + > =A0gdb/btrace.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 | =A0939 ++++++++++++++++++++++ > =A0gdb/btrace.h =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 | =A0 92 +++ > =A0gdb/command.h =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0| =A0 =A02 +- > =A0gdb/common/linux-btrace.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0| =A0368 +++++++++ > =A0gdb/common/linux-btrace.h =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0| =A0 76 ++ > =A0gdb/config.in =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0| =A0 =A03 + > =A0gdb/config/i386/linux.mh =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 | =A0 =A03 +- > =A0gdb/config/i386/linux64.mh =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= | =A0 =A02 +- > =A0gdb/configure =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0| =A0 13 + > =A0gdb/configure.ac =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 | =A0 =A02 + > =A0gdb/disasm.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 | =A0 40 +- > =A0gdb/disasm.h =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 | =A0 =A08 +- > =A0gdb/features/btrace.dtd =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0| =A0 12 + > =A0gdb/gdbserver/Makefile.in =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0| =A0 =A06 +- > =A0gdb/gdbserver/config.in =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0| =A0 =A03 + > =A0gdb/gdbserver/configure =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0| =A0 =A02 +- > =A0gdb/gdbserver/configure.ac =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= | =A0 =A02 +- > =A0gdb/gdbserver/configure.srv =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0| =A0 34 +- > =A0gdb/gdbserver/gdbthread.h =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0| =A0 =A05 + > =A0gdb/gdbserver/inferiors.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0| =A0 =A03 + > =A0gdb/gdbserver/linux-low.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0| =A0 42 + > =A0gdb/gdbserver/server.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 | =A0171 ++++ > =A0gdb/gdbserver/target.h =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 | =A0 38 + > =A0gdb/gdbthread.h =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0| =A0 =A04 + > =A0gdb/i386-linux-nat.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 | =A0 =A02 + > =A0gdb/infcmd.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 | =A0 =A02 + > =A0gdb/linux-nat-btrace.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 | =A0 86 ++ > =A0gdb/linux-nat-btrace.h =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= =A0 | =A0 28 + > =A0gdb/remote.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 | =A0208 +++++ > =A0gdb/source.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 | =A0 19 +- > =A0gdb/symtab.h =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 | =A0 =A06 + > =A0gdb/target.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 | =A0 20 + > =A0gdb/target.h =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 | =A0 36 +- > =A0gdb/testsuite/configure.ac =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0= | =A0 =A02 +- > =A0gdb/testsuite/gdb.base/page.exp =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0| = =A0 =A03 +- > =A0gdb/testsuite/gdb.btrace/Makefile.in =A0 =A0 =A0 =A0 =A0 =A0 | =A0 13 + > =A0gdb/testsuite/gdb.btrace/a.s =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 |= =A0 24 + > =A0gdb/testsuite/gdb.btrace/allthreads_trace.exp =A0 =A0| =A0270 +++++++ > =A0gdb/testsuite/gdb.btrace/b.s =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 |= =A0 23 + > =A0gdb/testsuite/gdb.btrace/dec.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 | = =A0 =A04 + > =A0gdb/testsuite/gdb.btrace/decrement.exp =A0 =A0 =A0 =A0 =A0 | =A0140 ++= ++ > =A0gdb/testsuite/gdb.btrace/decrement.s =A0 =A0 =A0 =A0 =A0 =A0 | =A0 32 + > =A0gdb/testsuite/gdb.btrace/disable_all.exp =A0 =A0 =A0 =A0 | =A0198 +++++ > =A0gdb/testsuite/gdb.btrace/enable.exp =A0 =A0 =A0 =A0 =A0 =A0 =A0| =A0 8= 3 ++ > =A0gdb/testsuite/gdb.btrace/enable_all.exp =A0 =A0 =A0 =A0 =A0| =A0201 ++= +++ > =A0gdb/testsuite/gdb.btrace/enable_range.exp =A0 =A0 =A0 =A0| =A0198 +++++ > =A0gdb/testsuite/gdb.btrace/inc.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 | = =A0 =A04 + > =A0gdb/testsuite/gdb.btrace/list.exp =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0| =A0= 169 ++++ > =A0gdb/testsuite/gdb.btrace/list.s =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0| = =A0 68 ++ > =A0gdb/testsuite/gdb.btrace/list_function.c =A0 =A0 =A0 =A0 | =A0 12 + > =A0gdb/testsuite/gdb.btrace/list_function.exp =A0 =A0 =A0 | =A0 59 ++ > =A0gdb/testsuite/gdb.btrace/list_options.exp =A0 =A0 =A0 =A0| =A0107 +++ > =A0gdb/testsuite/gdb.btrace/main.s =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0| = =A0 32 + > =A0gdb/testsuite/gdb.btrace/main_asm.exp =A0 =A0 =A0 =A0 =A0 =A0| =A0113 = +++ > =A0gdb/testsuite/gdb.btrace/main_segv.exp =A0 =A0 =A0 =A0 =A0 | =A0 84 ++ > =A0gdb/testsuite/gdb.btrace/main_segv.s =A0 =A0 =A0 =A0 =A0 =A0 | =A0 28 + > =A0gdb/testsuite/gdb.btrace/sanity_crash.exp =A0 =A0 =A0 =A0| =A0 69 ++ > =A0gdb/testsuite/gdb.btrace/sanity_crash.s =A0 =A0 =A0 =A0 =A0| =A0 52 ++ > =A0gdb/testsuite/gdb.btrace/thr_callback_32.s =A0 =A0 =A0 | =A0116 +++ > =A0gdb/testsuite/gdb.btrace/thr_callback_64.s =A0 =A0 =A0 | =A0116 +++ > =A0gdb/testsuite/gdb.btrace/threads.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 | =A0 9= 6 +++ > =A0gdb/testsuite/gdb.btrace/threads_asm.c =A0 =A0 =A0 =A0 =A0 | =A0 78 ++ > =A0gdb/testsuite/gdb.btrace/threads_auto.exp =A0 =A0 =A0 =A0| =A0113 +++ > =A0gdb/testsuite/gdb.btrace/threads_independent.exp | =A0119 +++ > =A0gdb/testsuite/gdb.btrace/threads_nonstop.exp =A0 =A0 | =A0182 +++++ > =A0gdb/testsuite/gdb.btrace/trace_iteration.exp =A0 =A0 | =A0264 ++++++ > =A0gdb/testsuite/lib/btrace.exp =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 |= =A0 72 ++ > =A0gdb/thread.c =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 =A0 = =A0 =A0 =A0 =A0 | =A0 =A03 + > =A071 files changed, 5393 insertions(+), 49 deletions(-) > =A0create mode 100644 gdb/btrace.c > =A0create mode 100644 gdb/btrace.h > =A0create mode 100644 gdb/common/linux-btrace.c > =A0create mode 100644 gdb/common/linux-btrace.h > =A0create mode 100644 gdb/features/btrace.dtd > =A0create mode 100644 gdb/linux-nat-btrace.c > =A0create mode 100644 gdb/linux-nat-btrace.h > =A0create mode 100755 gdb/testsuite/gdb.btrace/Makefile.in > =A0create mode 100755 gdb/testsuite/gdb.btrace/a.s > =A0create mode 100755 gdb/testsuite/gdb.btrace/allthreads_trace.exp > =A0create mode 100755 gdb/testsuite/gdb.btrace/b.s > =A0create mode 100644 gdb/testsuite/gdb.btrace/dec.c > =A0create mode 100755 gdb/testsuite/gdb.btrace/decrement.exp > =A0create mode 100755 gdb/testsuite/gdb.btrace/decrement.s > =A0create mode 100755 gdb/testsuite/gdb.btrace/disable_all.exp > =A0create mode 100644 gdb/testsuite/gdb.btrace/enable.exp > =A0create mode 100755 gdb/testsuite/gdb.btrace/enable_all.exp > =A0create mode 100755 gdb/testsuite/gdb.btrace/enable_range.exp > =A0create mode 100644 gdb/testsuite/gdb.btrace/inc.c > =A0create mode 100644 gdb/testsuite/gdb.btrace/list.exp > =A0create mode 100644 gdb/testsuite/gdb.btrace/list.s > =A0create mode 100644 gdb/testsuite/gdb.btrace/list_function.c > =A0create mode 100644 gdb/testsuite/gdb.btrace/list_function.exp > =A0create mode 100755 gdb/testsuite/gdb.btrace/list_options.exp > =A0create mode 100755 gdb/testsuite/gdb.btrace/main.s > =A0create mode 100755 gdb/testsuite/gdb.btrace/main_asm.exp > =A0create mode 100755 gdb/testsuite/gdb.btrace/main_segv.exp > =A0create mode 100755 gdb/testsuite/gdb.btrace/main_segv.s > =A0create mode 100755 gdb/testsuite/gdb.btrace/sanity_crash.exp > =A0create mode 100755 gdb/testsuite/gdb.btrace/sanity_crash.s > =A0create mode 100755 gdb/testsuite/gdb.btrace/thr_callback_32.s > =A0create mode 100755 gdb/testsuite/gdb.btrace/thr_callback_64.s > =A0create mode 100755 gdb/testsuite/gdb.btrace/threads.c > =A0create mode 100755 gdb/testsuite/gdb.btrace/threads_asm.c > =A0create mode 100755 gdb/testsuite/gdb.btrace/threads_auto.exp > =A0create mode 100755 gdb/testsuite/gdb.btrace/threads_independent.exp > =A0create mode 100755 gdb/testsuite/gdb.btrace/threads_nonstop.exp > =A0create mode 100755 gdb/testsuite/gdb.btrace/trace_iteration.exp > =A0create mode 100644 gdb/testsuite/lib/btrace.exp >