This is the mail archive of the
gdb@sourceware.org
mailing list for the GDB project.
Re: JIT debugging (Attach and speed)
- From: Yichao Yu <yyc1992 at gmail dot com>
- To: Pedro Alves <palves at redhat dot com>
- Cc: gdb at sourceware dot org, Paul Pluzhnikov <ppluzhnikov at google dot com>
- Date: Wed, 23 Mar 2016 15:32:01 -0400
- Subject: Re: JIT debugging (Attach and speed)
- Authentication-results: sourceware.org; auth=none
- References: <CAMvDr+TKDYeECiUK7Kz7TGSRF826Vq24z_=CPQXz1vyxmMUm_w at mail dot gmail dot com> <56F168D7 dot 9050405 at redhat dot com> <56F16F8F dot 9050404 at redhat dot com> <CAMvDr+TRSF16fKnnb9tWD4Xctek31Sdgx2m1ct=UctXL_b9vuA at mail dot gmail dot com> <56F1759F dot 3070100 at redhat dot com> <CAMvDr+QcMrHk6y7hGr1NaijEXK=dH+J0CGJZs6m_Rk2D2oSm-g at mail dot gmail dot com> <56F17A23 dot 90909 at redhat dot com> <CAMvDr+ST=4a11-B=ymUQDRdOCZmVUgdfkhFbUDknvjkaGjtGWw at mail dot gmail dot com> <CAMvDr+Ra3yi465XBcJR=oYtOM8+-=1Hj2xs32n-wYVpiN_exUQ at mail dot gmail dot com> <56F2DF69 dot 9030908 at redhat dot com>
>>
>> [1] https://sourceware.org/ml/gdb/2011-01/msg00009.html
>> [2] http://i.imgur.com/6Ca6Yal.jpg
>> [3] http://i.imgur.com/aHKGACX.jpg
>
>
> Ouch. Not sure what to do here.
>
> Maybe we could cache something above find_pc_section ->
> update_section_map, to avoid the section look ups.
> From [2], we see that this is in the inline frame sniffer.
> Maybe we can add a shortcut here, based on assuming that if
> we're stopped at the jit event breakpoint address, then we're
> not stopped at an inlining site. That is, a trick similar to
> the pc_at_non_inline_function check in infrun.c.
>
> So, as a quick hack, if you make inline_frame_sniffer bail out early
> with 0, does it improve things?
With
diff --git a/gdb/inline-frame.c b/gdb/inline-frame.c
index f8ba249..49cae00 100644
--- a/gdb/inline-frame.c
+++ b/gdb/inline-frame.c
@@ -206,6 +206,7 @@ inline_frame_sniffer (const struct frame_unwind *self,
struct frame_info *this_frame,
void **this_cache)
{
+ return 0;
CORE_ADDR this_pc;
const struct block *frame_block, *cur_block;
int depth;
The timing looks the same. =(
>
>>
>>>>>> It'd even be better to somehow restrict breakpoint re-setting
>>>>>> to the jit modules that were added/removed/changed, but
>>>>>> that's harder.
>>
>>
>> I've re-read the 2011 thread and I think I have a slightly better
>> understanding now. IIUC we need to check if the newly registered file
>> contains any pending breakpoints. Is the problem that this is done by
>> checking it over all the registered object files? Is it possible to
>> avoid O(n^2) scaling without only re-setting on the jit object file
>> currently being modified?
>
>
> Batch loading the object files comes to mind. From reading
> the code, it seems like gdb only reads on object file per
> JIT_REGISTER event. The descriptor->relevant_entry one.
> Is that correct? Is there a reason the loader couldn't batch
> compile all functions, only call the JIT_REGISTER once, and
> then have GDB follow descriptor->relevant_entry->next_entry, etc.?
What do you mean by "loader"? since you mentioned call JIT_REGISTER I
assume you mean JIT compiler?
At least for the julia JIT, we already try to batch compile as much as
we can (this is also necessary to save memory for example, since most
functions are much smaller than a page) However, it is impossible to
know all the functions a program is going to call so there'll be
continues jitting going on. For normal program this shouldn't be that
bad since it should execute a small number of functions most of the
time and the jit don't need to work anymore after some initial warm
up. However, the test suite is a very case since it is written to call
all the functions with many different types which will force the
compiler to emit a lot of functions and run them.
>
> If we could batch load, then we could also defer breakpoint re-set
> until all is loaded, as well as inhibit section map updates,
> as done in svr4_handle_solib_event for normal DSO loading.
>
> Thanks,
> Pedro Alves
>