mirror of
https://github.com/ruby/ruby.git
synced 2025-09-16 17:14:01 +02:00
[ci-skip][Feature #18910][lldb] Provide class framework for lldb commands
`lldb_cruby.py` manages lldb custom commands using functions. The file is a large list of Python functions, and an init handler to map some of the Python functions into the debugger, to enable execution of custom logic during a debugging session. Since LLDB 3.7 (September 2015) there has also been support for using python classes rather than bare functions, as long as those classes implement a specific interface. This PR Introduces some more defined structure to the LLDB helper functions by switching from the function based implementation to the class based one, and providing an auto-loading mechanism by which new functions can be loaded. The intention behind this change is to make working with the LLDB helpers easier, by reducing code duplication, providing a consistent structure and a clearer API for developers. The current function based approach has some advantages and disadvantages Advantages: - Adding new code is easy. - All the code is self contained and searchable. Disadvantages: - No visible organisation of the file contents. This means - Hard to tell which functions are utility functions and which are available to you in a debugging session - Lots of code duplication within lldb functions - Large files quickly become intimidating to work with - for example, `lldb_disasm.py` was implemented as a seperate Python module because it was easier to start with a clean slate than add significant amounts of code to `lldb_cruby.py` This PR attempts, to fix the disadvantages of the current approach and maintain, or enhance, the benefits. The new structure of a command looks like this; ``` class TestCommand(RbBaseCommand): # program is the keyword the user will type in lldb to execute this command program = "test" # help_string will be displayed in lldb when the user uses the help functions help_string = "This is a test command to show how to implement lldb commands" # call is where our command logic will be implemented def call(self, debugger, command, exe_ctx, result): pass ``` If the command fulfils the following criteria it will then be auto-loaded when an lldb session is started: - The package file must exist inside the `commands` directory and the filename must end in `_command.py` - The package must implement a class whose name ends in `Command` - The class inherits from `RbBaseCommand` or at minimum a class that shares the same interface as `RbBaseCommand` (at minimum this means defining `__init__` and `__call__`, and using `__call__` to call `call` which is defined in the subclasses). - The class must have a class variable `package` that is a String. This is the name of the command you'll call in the `lldb` debugger.
This commit is contained in:
parent
d903e76726
commit
f1ccfa0c2c
Notes:
git
2022-08-19 02:26:13 +09:00
5 changed files with 124 additions and 5 deletions
25
misc/commands/command_template.py
Normal file
25
misc/commands/command_template.py
Normal file
|
@ -0,0 +1,25 @@
|
|||
# This is a command template for implementing a helper function inside LLDB. To
|
||||
# use this file
|
||||
# 1. Copy it and rename the copy so it ends with `_command.py`.
|
||||
# 2. Rename the class to something descriptive that ends with Command.
|
||||
# 3. Change the program variable to be a descriptive command name
|
||||
# 4. Ensure you are inheriting from RbBaseCommand or another command that
|
||||
# implements the same interfact
|
||||
|
||||
# This test command inherits from RbBaseCommand which provides access to Ruby
|
||||
# globals and utility helpers
|
||||
class TestCommand(RbBaseCommand):
|
||||
# program is the keyword the user will type in lldb to execute this command
|
||||
program = "test"
|
||||
|
||||
# help_string will be displayed in lldb when the user uses the help functions
|
||||
help_string = "This is a test command to show how to implement lldb commands"
|
||||
|
||||
# call is where our command logic will be implemented
|
||||
def call(self, debugger, command, exe_ctx, result):
|
||||
# This method will be called once the LLDB environment has been setup.
|
||||
# You will have access to self.target, self.process, self.frame, and
|
||||
# self.thread
|
||||
#
|
||||
# This is where we should implement our command logic
|
||||
pass
|
Loading…
Add table
Add a link
Reference in a new issue