Introduce a unified target hook command system for LLDB that handles
multiple target lifecycle events (module load, module unload, process
stop) through a single Hook class.
The existing target stop-hook commands remain unchanged for now, meaning
stop-hooks can now be created through either target stop-hook add or
target hook add -S.
A future follow-up can alias target stop-hook to the unified system to
consolidate the two paths.
New commands:
- target hook add [-o cmd] [-P class] [-u] [-S] - create a hook (fires
on module load by default, optionally on unload/stop)
- target hook add-filter [filter-opts] <hook-id> - attach stop-event
filters (shlib, function, file/line, thread) to an existing hook
- target hook list / delete / enable / disable - manage hooks
- target hook {enable,disable} {module-loaded|module-unloaded|stop-hook}
<id> - per-event toggling
top-event filter options live on a separate add-filter command rather
than on target hook add, keeping the add command clean and making the
system safe for filters on other event types.
Ran the tests + Made sure stop tests are passing as well.
---------
Co-authored-by: Bar Soloveychik <barsolo@fb.com>
169 lines
4.0 KiB
Plaintext
169 lines
4.0 KiB
Plaintext
# Test hook add/list/delete/enable/disable commands.
|
|
#
|
|
# RUN: %lldb -b -s %s 2>&1 | FileCheck %s
|
|
|
|
# Adding hooks assigns incrementing IDs.
|
|
target hook add -L -o "script print('hook1')"
|
|
# CHECK: Hook #1 added.
|
|
target hook add -L -o "script print('hook2')"
|
|
# CHECK: Hook #2 added.
|
|
target hook add -L -o "script print('hook3')"
|
|
# CHECK: Hook #3 added.
|
|
|
|
# List all hooks.
|
|
target hook list
|
|
# CHECK: (lldb) target hook list
|
|
# CHECK: Hook: 1
|
|
# CHECK: State: enabled
|
|
# CHECK: Triggers: load
|
|
# CHECK: Commands:
|
|
# CHECK: script print('hook1')
|
|
# CHECK: Hook: 2
|
|
# CHECK: State: enabled
|
|
# CHECK: Triggers: load
|
|
# CHECK: Commands:
|
|
# CHECK: script print('hook2')
|
|
# CHECK: Hook: 3
|
|
# CHECK: State: enabled
|
|
# CHECK: Triggers: load
|
|
# CHECK: Commands:
|
|
# CHECK: script print('hook3')
|
|
|
|
# Disable a hook.
|
|
target hook disable 2
|
|
target hook list
|
|
# CHECK: (lldb) target hook list
|
|
# CHECK: Hook: 1
|
|
# CHECK: State: enabled
|
|
# CHECK: Hook: 2
|
|
# CHECK: State: disabled
|
|
# CHECK: Hook: 3
|
|
# CHECK: State: enabled
|
|
|
|
# Re-enable the hook.
|
|
target hook enable 2
|
|
target hook list
|
|
# CHECK: (lldb) target hook list
|
|
# CHECK: Hook: 1
|
|
# CHECK: State: enabled
|
|
# CHECK: Hook: 2
|
|
# CHECK: State: enabled
|
|
# CHECK: Hook: 3
|
|
# CHECK: State: enabled
|
|
|
|
# Delete a hook in the middle.
|
|
target hook delete 2
|
|
target hook list
|
|
# CHECK: (lldb) target hook list
|
|
# CHECK: Hook: 1
|
|
# CHECK-NOT: Hook: 2
|
|
# CHECK: Hook: 3
|
|
|
|
# New hook gets a new ID (not reused).
|
|
target hook add -L -o "script print('hook4')"
|
|
# CHECK: Hook #4 added.
|
|
target hook list
|
|
# CHECK: (lldb) target hook list
|
|
# CHECK: Hook: 1
|
|
# CHECK-NOT: Hook: 2
|
|
# CHECK: Hook: 3
|
|
# CHECK: Hook: 4
|
|
|
|
# Delete all hooks.
|
|
settings set auto-confirm true
|
|
target hook delete
|
|
target hook list
|
|
# CHECK: (lldb) target hook list
|
|
# CHECK: No hooks.
|
|
|
|
# Add a hook with --on-load and --on-unload.
|
|
target hook add -L -u -o "script print('load+unload')"
|
|
# CHECK: Hook #5 added.
|
|
target hook list
|
|
# CHECK: (lldb) target hook list
|
|
# CHECK: Hook: 5
|
|
# CHECK: State: enabled
|
|
# CHECK: Triggers: load, unload
|
|
# CHECK: Commands:
|
|
# CHECK: script print('load+unload')
|
|
|
|
# Add a hook with multiple one-liner commands.
|
|
target hook add -L -o "script print('first')" -o "script print('second')"
|
|
# CHECK: Hook #6 added.
|
|
target hook list
|
|
# CHECK: Hook: 6
|
|
# CHECK: State: enabled
|
|
# CHECK: Triggers: load
|
|
# CHECK: Commands:
|
|
# CHECK: script print('first')
|
|
# CHECK: script print('second')
|
|
|
|
# Disable all hooks.
|
|
target hook disable
|
|
target hook list
|
|
# CHECK: (lldb) target hook list
|
|
# CHECK: Hook: 5
|
|
# CHECK: State: disabled
|
|
# CHECK: Hook: 6
|
|
# CHECK: State: disabled
|
|
|
|
# Enable all hooks.
|
|
target hook enable
|
|
target hook list
|
|
# CHECK: (lldb) target hook list
|
|
# CHECK: Hook: 5
|
|
# CHECK: State: enabled
|
|
# CHECK: Hook: 6
|
|
# CHECK: State: enabled
|
|
|
|
# Add a hook with --on-stop only.
|
|
target hook delete
|
|
target hook add -S -o "bt"
|
|
# CHECK: Hook #7 added.
|
|
target hook list
|
|
# CHECK: (lldb) target hook list
|
|
# CHECK: Hook: 7
|
|
# CHECK: State: enabled
|
|
# CHECK: Triggers: stop
|
|
# CHECK: Commands:
|
|
# CHECK: bt
|
|
|
|
# Add a hook with all triggers.
|
|
target hook add -L -u -S -o "script print('all events')"
|
|
# CHECK: Hook #8 added.
|
|
target hook list
|
|
# CHECK: Hook: 8
|
|
# CHECK: State: enabled
|
|
# CHECK: Triggers: load, unload, stop
|
|
|
|
# Add a hook with --on-stop and inline filter.
|
|
target hook delete
|
|
target hook add -S -s mylib.so -o "bt"
|
|
# CHECK: Hook #9 added.
|
|
target hook list
|
|
# CHECK: (lldb) target hook list
|
|
# CHECK: Hook: 9
|
|
# CHECK: State: enabled
|
|
# CHECK: Triggers: stop
|
|
# CHECK: Commands:
|
|
# CHECK: bt
|
|
# CHECK: Specifier:
|
|
# CHECK: Module: mylib.so
|
|
|
|
# Per-trigger disable: remove stop from hook #9 using modify.
|
|
target hook modify --disable-trigger stop 9
|
|
target hook list
|
|
# CHECK: (lldb) target hook list
|
|
# CHECK: Hook: 9
|
|
# CHECK: State: enabled
|
|
# CHECK-NOT: Triggers: stop
|
|
# CHECK: Commands:
|
|
|
|
# Per-trigger enable: re-add stop to hook #9 using modify.
|
|
target hook modify --enable-trigger stop 9
|
|
target hook list
|
|
# CHECK: (lldb) target hook list
|
|
# CHECK: Hook: 9
|
|
# CHECK: State: enabled
|
|
# CHECK: Triggers: stop
|