> On Apr 13, 2017, at 9:06 AM, Scott Smith via lldb-dev 
> <lldb-dev@lists.llvm.org> wrote:
> 
> Ok.  I tried doing something similar to gdb but was unable to make any 
> headway because they have so many global variables.  It looked more promising 
> with lldb since there were already some locks.
> 
> I assume you're talking about check-lldb?
> https://lldb.llvm.org/test.html
> 
> I'll work on getting those to pass reliably.
> 
> As for eager vs not, I was just running code that already runs as part of:
> b main
> run
> 
> That said, I'm sure all the symbol loading is due to setting a breakpoint on 
> a function name.  Is there really that much value in deferring that?  What if 
> loading the symbols was done in parallel without delaying execution of the 
> debugged program if you didn't have a breakpoint?  Then the impact would be 
> (nearly) invisible to the end user.

Currently, if you say:

(lldb) break set -n main -s MyBinary

then lldb will only read the symbol table for MyBinary.  If read in all symbols 
when you first see the libraries, you remove that user-controllable 
optimization.  

If the parallelization gets startup to the point where the extra work doesn't 
matter much, then I'm not 100% against the trade-off.  But that's the trade-off.

Jim



> 
> On Thu, Apr 13, 2017 at 5:35 AM, Pavel Labath <lab...@google.com> wrote:
> I've have looked at paralelization of the module loading code some time ago, 
> albeit with a slightly different use case in mind. I eventually abandoned it 
> (at least temporarily) because I could not get it to work correctly for all 
> use cases.
> 
> I do think that doing this is a good idea, but I think it will have to be 
> done with a very steady hand. E.g., if I patch your changes in right now I 
> get about 10 random tests failing on every test suite run, so it's clear that 
> you are introducing a race somewhere.
> 
> We will also need to have a discussion about what kind of work can be done 
> eagerly, as I believe we are trying to a lot of things very lazily (which 
> unfortunately makes efficient paralelization more complicated).
> 
>  
> 
> On 13 April 2017 at 06:34, Scott Smith via lldb-dev <lldb-dev@lists.llvm.org> 
> wrote:
> The POSIX dynamic loader processes one module at a time.  If you have a lot 
> of shared libraries, each with a lot of symbols, this creates unneeded 
> serialization (despite the use of TaskRunners during symbol loading, there is 
> still quite a bit of serialization when loading a library).
> 
> In order to parallelize this, I actually had to do two things.  Neither one 
> makes any difference, only the combination improves performance (I left them 
> as separate patches for clarity):
> 
> 1. Change the POSIX dynamic loader to fork each module into its own thread.  
> I didn't use TaskRunner because some of the called functions use TaskRunner, 
> and it isn't recursion safe.  The final modules are added to the list in the 
> original order despite whatever order the threads finish.
> 
> 2. Change Module::AppendImpl to fire off some expensive work as a separate 
> thread.
> 
> These two changes bring startup time down from 36 (assuming the previously 
> mentioned crc changes) seconds to 11.  It doesn't improve efficiency, it just 
> increases parallelism.
> 
> 
> _______________________________________________
> lldb-dev mailing list
> lldb-dev@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev
> 
> 
> 
> _______________________________________________
> lldb-dev mailing list
> lldb-dev@lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

_______________________________________________
lldb-dev mailing list
lldb-dev@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-dev

Reply via email to