<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On Apr 24, 2018, at 12:26 PM, Scott Funkenhauser via lldb-dev <<a href="mailto:lldb-dev@lists.llvm.org" class="">lldb-dev@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Hey guys,<div class=""><br class=""></div><div class="">I'm trying to track down an issue I'm seeing where dlopen takes significantly longer to execute when LLDB is attached vs GDB (I've attached a simple program that I used to reproduce the issue).</div><div class="">I was wondering if anybody had any idea what might be contributing to the additional execution time?</div></div></div></blockquote><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="">Running without any debugger attached:</div><div class="">$ ./lldb-load-sample</div><div class="">Handle: 0x555555768c80<br class=""></div><div class="">Done loading. 848.27ms<br class=""></div><div class="">$ ./lldb-load-sample</div><div class="">Handle: 0x555555768c80<br class=""></div><div class="">Done loading. 19.6047ms</div><div class=""><br class=""></div><div class="">I noticed that the first run was significantly slower than any subsequent runs. Most likely due to some caching in Linux.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">For LLDB:</div><div class=""><div class="">(lldb) file lldb-load-sample</div><div class="">Current executable set to 'lldb-load-sample' (x86_64).</div><div class="">(lldb) run</div><div class="">Process 82804 launched: '/lldb-load-sample' (x86_64)</div><div class="">Handle: 0x555555768c80<br class=""></div><div class="">Done loading. 5742.78ms</div><div class="">Process 82804 exited with status = 0 (0x00000000) </div><div class="">(lldb) run</div></div><div class=""><div class="">Process 83454 launched: '<span style="color:rgb(34,34,34);font-family:sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline" class="">/lldb-load-sample'</span> (x86_64)</div><div class="">Handle: 0x555555768c80<br class=""></div><div class="">Done loading. 19.4184ms<br class=""></div><div class="">Process 83454 exited with status = 0 (0x00000000)</div></div><div class=""><br class=""></div><div class="">I noticed that subsequent runs were much faster (most likely due to some caching in Linux / LLDB), but that isn't relevant in my situation. Exiting LLDB and starting a new LLDB process still has an extremely long first run (In this case ~5.5s). There are other real world cases (initializing Vulkan which does a bunch of dlopens) where this can add 10s of seconds really slowing down iteration time.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">For GDB:</div><div class="">(gdb) file lldb-load-sample</div><div class="">Reading symbols from a.out...done.<br class=""></div><div class="">(gdb) run</div><div class="">Starting program: /lldb-load-sample<br class=""></div><div class="">Handle: 0x555555768c80<br class=""></div><div class="">Done loading. 79.7276ms<br class=""></div><div class="">[Inferior 1 (process 85063) exited normally]<br class=""></div><div class="">(gdb) run</div><div class=""><div style="color:rgb(34,34,34);font-family:sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration-style:initial;text-decoration-color:initial" class="">Starting program: /lldb-load-sample<br class=""></div><div style="text-align:start;text-indent:0px;text-decoration-style:initial;text-decoration-color:initial" class="">Handle: 0x555555768c80<br class=""></div><div style="color:rgb(34,34,34);font-family:sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration-style:initial;text-decoration-color:initial" class="">Done loading. 80.325ms<br class=""></div><div style="color:rgb(34,34,34);font-family:sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration-style:initial;text-decoration-color:initial" class="">[Inferior 1 (process 85063) exited normally]</div><div style="color:rgb(34,34,34);font-family:sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration-style:initial;text-decoration-color:initial" class=""><br class=""></div><div style="color:rgb(34,34,34);font-family:sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;text-decoration-style:initial;text-decoration-color:initial" class="">As you can see the first run is slightly slower than running without a debugger attached, but it's not enough to be noticeable.</div></div></div></div></blockquote><br class=""></div><div>I would venture to say LLDB is indexing the debug info during the shared library load breakpoint for some reason. GDB might not have any breakpoints or symbols to find to do in the shared library, so it might not end up parsing anything. So my guess is LLDB is looking for a symbol in any shared library that is loaded and when the shared library gets loaded it causes LLDB to do more work. All of LLDB's breakpoints are always looking for new locations to resolve (file and line breakpoints, breakpoints by name, and other plug-ins might be looking for things). You might try enabling with:</div><div><br class=""></div><div>(lldb) log enable --timestamp --file /tmp/log.txt dwarf info</div><div>(lldb) file lldb-load-sample</div><div>(lldb) run</div><div>(lldb) quit</div><div><br class=""></div><div>then see if you can see any delays inside of LLDB.</div><div><br class=""></div><div>Greg</div><div><br class=""></div><br class=""></body></html>