How to exclude a module from symbol parsing of lldb?
Categories:
How to Exclude Modules from Symbol Parsing in LLDB
Learn how to optimize LLDB debugging sessions by excluding unnecessary modules from symbol parsing, significantly improving startup times and responsiveness.
When debugging large applications, especially those with many dynamically loaded libraries or system frameworks, LLDB can spend a considerable amount of time parsing debug symbols for modules you're not interested in. This can lead to slow startup times and a less responsive debugger experience. Fortunately, LLDB provides mechanisms to explicitly exclude certain modules from this symbol parsing process, allowing you to focus on the code that matters most.
Understanding LLDB Symbol Loading
By default, LLDB attempts to load debug symbols for all loaded modules within your target process. While comprehensive, this behavior can be inefficient. Debug symbols contain a wealth of information – function names, variable types, source line mappings – which are crucial for effective debugging. However, if you're debugging a specific application and not, for example, the inner workings of libSystem.dylib
or UIKit.framework
, parsing their symbols might be a waste of resources.
LLDB Symbol Loading Process with Exclusion
Excluding Modules via Settings
The primary method to exclude modules is through LLDB's settings. You can configure target.process.unload-module-regexps
to specify a list of regular expressions. Any module whose path matches one of these regular expressions will have its symbols skipped during loading. This setting is highly flexible and can be applied globally, per-session, or even conditionally.
.*\.dylib$
will match all dynamic libraries, while ^/usr/lib/
will match all modules in the /usr/lib
directory. Be mindful of escaping special characters in your regex.settings set target.process.unload-module-regexps ["^/usr/lib/", ".*\.framework/Versions/A/.*$"]
# To append a new regex:
settings append target.process.unload-module-regexps ".*\.so$"
# To view current settings:
settings show target.process.unload-module-regexps
Configuring LLDB to exclude modules using regular expressions
Applying Exclusions in .lldbinit
For persistent exclusion settings across all your LLDB sessions, it's best to place these commands in your ~/.lldbinit
file. This ensures that the exclusions are active every time you launch LLDB, without needing to re-type them manually.
# ~/.lldbinit
settings set target.process.unload-module-regexps ["^/usr/lib/", "^/System/Library/Frameworks/", ".*\.framework/Versions/A/.*$"]
# You can also add specific frameworks or libraries
settings append target.process.unload-module-regexps "^/Applications/MyApp.app/Contents/Frameworks/MyThirdParty.framework/"
# Optional: To disable source lookup for unloaded modules (improves performance further)
settings set target.process.disable-source-lookup-for-unloaded-modules true
Example ~/.lldbinit
configuration for module exclusion
unload-module-regexps
if needed.1. Step 1
Identify modules to exclude: Run image list
in LLDB to see all loaded modules and their paths. Look for system frameworks or third-party libraries you typically don't debug.
2. Step 2
Craft regular expressions: Based on the paths, create regular expressions that accurately match the modules you want to exclude. Test them using an online regex tester if unsure.
3. Step 3
Add to ~/.lldbinit
: Open or create your ~/.lldbinit
file and add the settings set target.process.unload-module-regexps
command with your list of regex patterns. If you have existing regexps, consider using settings append
.
4. Step 4
Restart LLDB: Close and reopen LLDB to apply the new settings.
5. Step 5
Verify exclusion: Start a debugging session and use image list
again. Modules matching your regexps should now show (symbols not loaded)
next to them, or LLDB will load them much faster.