mirror of
https://github.com/holub/mame
synced 2025-04-22 00:11:58 +03:00
452 lines
19 KiB
ReStructuredText
452 lines
19 KiB
ReStructuredText
.. _luascript-ref-debugger:
|
||
|
||
Lua Debugger Classes
|
||
====================
|
||
|
||
Some of MAME’s core debugging features can be controlled from Lua script. The
|
||
debugger must be enabled to use the debugger features (usually by passing
|
||
``-debug`` on the command line).
|
||
|
||
.. contents::
|
||
:local:
|
||
:depth: 1
|
||
|
||
|
||
.. _luascript-ref-debugsymtable:
|
||
|
||
Symbol table
|
||
------------
|
||
|
||
Wrap’s MAME’s ``symbol_table`` class, providing named symbols that can be used
|
||
in expressions. Note that symbol tables can be created and used even when the
|
||
debugger is not enabled.
|
||
|
||
Instantiation
|
||
~~~~~~~~~~~~~
|
||
|
||
emu.symbol_table(machine)
|
||
Creates a new symbol table in the context of the specified machine,
|
||
emu.symbol_table(parent, [device])
|
||
Creates a new symbol table with the specified parent symbol table. If a
|
||
device is specified and it implements ``device_memory_interface``, it will
|
||
be used as the base for looking up address spaces and memory regions. Note
|
||
that if a device that does not implement ``device_memory_interface`` is
|
||
supplied, it will not be used (address spaces and memory regions will be
|
||
looked up relative to the root device).
|
||
emu.symbol_table(device)
|
||
Creates a new symbol table in the context of the specified device. If the
|
||
device implements ``device_memory_interface``, it will be used as the base
|
||
for looking up address spaces and memory regions. Note that if a device
|
||
that does not implement ``device_memory_interface`` is supplied, it will
|
||
only be used to determine the machine context (address spaces and memory
|
||
regions will be looked up relative to the root device).
|
||
|
||
Methods
|
||
~~~~~~~
|
||
|
||
symbols:set_memory_modified_func(cb)
|
||
Set a function to call when memory is modified via the symbol table. No
|
||
arguments are passed to the function and any return values are ignored.
|
||
Call with ``nil`` to remove the callback.
|
||
symbols:add(name, [value])
|
||
Adds a named integer symbol. The name must be a string. If a value is
|
||
supplied, it must be an integer. If a value is supplied, a read-only symbol
|
||
is added with the supplied value. If no value is supplied, a read/write
|
||
symbol is created with and initial value of zero. If a symbol entry with
|
||
the specified name already exists in the symbol table, it will be replaced.
|
||
|
||
Returns the new :ref:`symbol entry <luascript-ref-debugsymentry>`.
|
||
symbols:add(name, getter, [setter], [format])
|
||
Adds a named integer symbol using getter and optional setter callbacks. The
|
||
name must be a string. The getter must be a function returning an integer
|
||
for the symbol value. If supplied, the setter must be a function that
|
||
accepts a single integer argument for the new value of the symbol. A format
|
||
string for displaying the symbol value may optionally be supplied. If a
|
||
symbol entry with the specified name already exists in the symbol table, it
|
||
will be replaced.
|
||
|
||
Returns the new :ref:`symbol entry <luascript-ref-debugsymentry>`.
|
||
symbols:add(name, minparams, maxparams, execute)
|
||
Adds a named function symbol. The name must be a string. The minimum and
|
||
maximum numbers of parameters must be integers. If a symbol entry with the
|
||
specified name already exists in the symbol table, it will be replaced.
|
||
|
||
Returns the new :ref:`symbol entry <luascript-ref-debugsymentry>`.
|
||
symbols:find(name)
|
||
Returns the :ref:`symbol entry <luascript-ref-debugsymentry>` with the
|
||
specified name, or ``nil`` if there is no symbol with the specified name in
|
||
the symbol table.
|
||
symbols:find_deep(name)
|
||
Returns the :ref:`symbol entry <luascript-ref-debugsymentry>` with the
|
||
specified name, or ``nil`` if there is no symbol with the specified name in
|
||
the symbol table or any of its parent symbol tables.
|
||
symbols:value(name)
|
||
Returns the integer value of the symbol with the specified name, or zero if
|
||
there is no symbol with the specified name in the symbol table or any of its
|
||
parent symbol tables. Raises an error if the symbol with specified name is
|
||
a function symbol.
|
||
symbols:set_value(name, value)
|
||
Sets the value of the symbol with the specified name. Raises an error if
|
||
the symbol with the specified name is a read-only integer symbol or if it is
|
||
a function symbol. Has no effect if there is no symbol with the specified
|
||
name in the symbol table or any of its parent symbol tables.
|
||
symbols:memory_value(name, space, offset, size, disable_se)
|
||
Read a value from memory. Supply the name or tag of the address space or
|
||
memory region to read from, or ``nil`` to use the address space or memory
|
||
region implied by the ``space`` argument. See
|
||
:ref:`memory accesses in debugger expressions <debugger-express-mem>` for
|
||
access type specifications that can be used for the ``space`` argument.
|
||
The access size is specified in bytes, and must be 1, 2, 4 or 8. The
|
||
``disable_se`` argument specifies whether memory access side effects should
|
||
be disabled.
|
||
symbols:set_memory_value(name, space, offset, value, size, disable_se)
|
||
Write a value to memory. Supply the name or tag of the address space or
|
||
memory region to write to, or ``nil`` to use the address space or memory
|
||
region implied by the ``space`` argument. See
|
||
:ref:`memory accesses in debugger expressions <debugger-express-mem>` for
|
||
access type specifications that can be used for the ``space`` argument.
|
||
The access size is specified in bytes, and must be 1, 2, 4 or 8. The
|
||
``disable_se`` argument specifies whether memory access side effects should
|
||
be disabled.
|
||
symbols:read_memory(space, address, size, apply_translation)
|
||
Read a value from an address space. The access size is specified in bytes,
|
||
and must be 1, 2, 4, or 8. If the ``apply_translation`` argument is true,
|
||
the address will be translated with debug read intention. Returns a value
|
||
of the requested size with all bits set if address translation fails.
|
||
symbols:write_memory(space, address, data, size, apply_translation)
|
||
Write a value to an address space. The access size is specified in bytes,
|
||
and must be 1, 2, 4, or 8. If the ``apply_translation`` argument is true,
|
||
the address will be translated with debug write intention. The symbol
|
||
table’s memory modified function will be called after the value is written.
|
||
The value will not be written and the symbol table’s memory modified
|
||
function will not be called if address translation fails.
|
||
|
||
Properties
|
||
~~~~~~~~~~
|
||
|
||
symbols.entries[]
|
||
The :ref:`symbol entries <luascript-ref-debugsymentry>` in the symbol table,
|
||
indexed by name. The ``at`` and ``index_of`` methods have O(n) complexity;
|
||
all other supported operations have O(1) complexity.
|
||
symbols.parent (read-only)
|
||
The parent symbol table, or ``nil`` if the symbol table has no parent.
|
||
|
||
|
||
.. _luascript-ref-debugexpression:
|
||
|
||
Parsed expression
|
||
-----------------
|
||
|
||
Wraps MAME’s ``parsed_expression`` class, which represents a tokenised debugger
|
||
expression. Note that parsed expressions can be created and used even when the
|
||
debugger is not enabled.
|
||
|
||
Instantiation
|
||
~~~~~~~~~~~~~
|
||
|
||
emu.parsed_expression(symbols)
|
||
Creates an empty expression that will use the supplied
|
||
:ref:`symbol table <luascript-ref-debugsymtable>` to look up symbols.
|
||
emu.parsed_expression(symbols, string, [default_base])
|
||
Creates an expression by parsing the supplied string, looking up symbols in
|
||
the supplied :ref:`symbol table <luascript-ref-debugsymtable>`. If the
|
||
default base for interpreting integer literals is not supplied, 16 is used
|
||
(hexadecimal). Raises an :ref:`expression error
|
||
<luascript-ref-debugexpressionerror>` if the string contains syntax errors
|
||
or uses undefined symbols.
|
||
|
||
Methods
|
||
~~~~~~~
|
||
|
||
expression:set_default_base(base)
|
||
Set the default base for interpreting numeric literals. The base must be a
|
||
positive integer.
|
||
expression:parse(string)
|
||
Parse a debugger expression string. Replaces the current contents of the
|
||
expression if it is not empty. Raises an :ref:`expression error
|
||
<luascript-ref-debugexpressionerror>` if the string contains syntax errors
|
||
or uses undefined symbols. The previous content of the expression is not
|
||
preserved when attempting to parse an invalid expression string.
|
||
expression:execute()
|
||
Evaluates the expression, returning an unsigned integer result. Raises an
|
||
:ref:`expression error <luascript-ref-debugexpressionerror>` if the
|
||
expression cannot be evaluated (e.g. attempting to call a function with an
|
||
invalid number of arguments).
|
||
|
||
Properties
|
||
~~~~~~~~~~
|
||
|
||
expression.is_empty (read-only)
|
||
A Boolean indicating whether the expression contains no tokens.
|
||
expression.original_string (read-only)
|
||
The original string that was parsed to create the expression.
|
||
expression.symbols (read/write)
|
||
The :ref:`symbol table <luascript-ref-debugsymtable>` used for to look up
|
||
symbols in the expression.
|
||
|
||
|
||
.. _luascript-ref-debugsymentry:
|
||
|
||
Symbol entry
|
||
------------
|
||
|
||
Wraps MAME’s ``symbol_entry`` class, which represents an entry in a
|
||
:ref:`symbol table <luascript-ref-debugsymtable>`. Note that symbol entries
|
||
must not be used after the symbol table they belong to is destroyed.
|
||
|
||
Instantiation
|
||
~~~~~~~~~~~~~
|
||
|
||
symbols:add(name, [value])
|
||
Adds an integer symbol to a
|
||
:ref:`symbol table <luascript-ref-debugsymtable>`, returning the new symbol
|
||
entry.
|
||
symbols:add(name, getter, [setter], [format])
|
||
Adds an integer symbol to a
|
||
:ref:`symbol table <luascript-ref-debugsymtable>`, returning the new symbol
|
||
entry.
|
||
symbols:add(name, minparams, maxparams, execute)
|
||
Adds function symbol to a
|
||
:ref:`symbol table <luascript-ref-debugsymtable>`, returning the new symbol
|
||
entry.
|
||
|
||
Properties
|
||
~~~~~~~~~~
|
||
|
||
entry.name (read-only)
|
||
The name of the symbol entry.
|
||
entry.format (read-only)
|
||
The format string used to convert the symbol entry to text for display.
|
||
entry.is_function (read-only)
|
||
A Boolean indicating whether the symbol entry is a callable function.
|
||
entry.is_lval (read-only)
|
||
A Boolean indicating whether the symbol entry is an integer symbol that can
|
||
be set (i.e. whether it can be used on the left-hand side of assignment
|
||
expressions).
|
||
entry.value (read/write)
|
||
The integer value of the symbol entry. Attempting to set the value raises
|
||
an error if the symbol entry is read-only. Attempting to get or set the
|
||
value of a function symbol raises an error.
|
||
|
||
|
||
.. _luascript-ref-debugman:
|
||
|
||
Debugger manager
|
||
----------------
|
||
|
||
Wraps MAME’s ``debugger_manager`` class, providing the main interface to control
|
||
the debugger.
|
||
|
||
Instantiation
|
||
~~~~~~~~~~~~~
|
||
|
||
manager.machine.debugger
|
||
Returns the global debugger manager instance, or ``nil`` if the debugger is
|
||
not enabled.
|
||
|
||
Methods
|
||
~~~~~~~
|
||
|
||
debugger:command(str)
|
||
Execute a debugger console command. The argument is the command string.
|
||
The output is sent to both the debugger console and the Lua console.
|
||
|
||
Properties
|
||
~~~~~~~~~~
|
||
|
||
debugger.consolelog[] (read-only)
|
||
The lines in the console log (output from debugger commands). This
|
||
container only supports index and length operations.
|
||
debugger.errorlog[] (read-only)
|
||
The lines in the error log (``logerror`` output). This container only
|
||
supports index and length operations.
|
||
debugger.visible_cpu (read/write)
|
||
The CPU device with debugger focus. Changes become visible in the debugger
|
||
console after the next step. Setting to a device that is not a CPU has no
|
||
effect.
|
||
debugger.execution_state (read/write)
|
||
Either ``"run"`` if the emulated system is running, or ``"stop"`` if it is
|
||
stopped in the debugger.
|
||
|
||
|
||
.. _luascript-ref-devdebug:
|
||
|
||
Device debugger interface
|
||
-------------------------
|
||
|
||
Wraps MAME’s ``device_debug`` class, providing the debugger interface to an
|
||
emulated CPU device.
|
||
|
||
Instantiation
|
||
~~~~~~~~~~~~~
|
||
|
||
manager.machine.devices[tag].debug
|
||
Returns the debugger interface for an emulated CPU device, or ``nil`` if the
|
||
device is not a CPU.
|
||
|
||
Methods
|
||
~~~~~~~
|
||
|
||
debug:step([cnt])
|
||
Step by the specified number of instructions. If the instruction count is
|
||
not provided, it defaults to a single instruction.
|
||
debug:go()
|
||
Run the emulated CPU.
|
||
debug:bpset(addr, [cond], [act])
|
||
Set a breakpoint at the specified address, with an optional condition and
|
||
action. If the action is not specified, it defaults to just breaking into
|
||
the debugger. Returns the breakpoint number for the new breakpoint.
|
||
|
||
If specified, the condition must be a debugger expression that will be
|
||
evaluated each time the breakpoint is hit. Execution will only be stopped
|
||
if the expression evaluates to a non-zero value. If the condition is not
|
||
specified, it defaults to always active.
|
||
debug:bpenable([bp])
|
||
Enable the specified breakpoint, or all breakpoints for the device if no
|
||
breakpoint number is specified. Returns whether the specified number
|
||
matched a breakpoint if a breakpoint number is specified, or ``nil`` if no
|
||
breakpoint number is specified.
|
||
debug:bpdisable([bp])
|
||
Disable the specified breakpoint, or all breakpoints for the device if no
|
||
breakpoint number is specified. Returns whether the specified number
|
||
matched a breakpoint if a breakpoint number is specified, or ``nil`` if no
|
||
breakpoint number is specified.
|
||
debug:bpclear([bp])
|
||
Clear the specified breakpoint, or all breakpoints for the device if no
|
||
breakpoint number is specified. Returns whether the specified number
|
||
matched a breakpoint if a breakpoint number is specified, or ``nil`` if no
|
||
breakpoint number is specified.
|
||
debug:bplist()
|
||
Returns a table of breakpoints for the device. The keys are the breakpoint
|
||
numbers, and the values are
|
||
:ref:`breakpoint objects <luascript-ref-breakpoint>`.
|
||
debug:wpset(space, type, addr, len, [cond], [act])
|
||
Set a watchpoint over the specified address range, with an optional
|
||
condition and action. The type must be ``"r"``, ``"w"`` or ``"rw"`` for a
|
||
read, write or read/write breakpoint. If the action is not specified, it
|
||
defaults to just breaking into the debugger. Returns the watchpoint number
|
||
for the new watchpoint.
|
||
|
||
If specified, the condition must be a debugger expression that will be
|
||
evaluated each time the breakpoint is hit. Execution will only be stopped
|
||
if the expression evaluates to a non-zero value. The variable 'wpaddr' is
|
||
set to the address that actually triggered the watchpoint, the variable
|
||
'wpdata' is set to the data that is being read or written, and the variable
|
||
'wpsize' is set to the size of the data in bytes. If the condition is not
|
||
specified, it defaults to always active.
|
||
debug:wpenable([wp])
|
||
Enable the specified watchpoint, or all watchpoints for the device if no
|
||
watchpoint number is specified. Returns whether the specified number
|
||
matched a watchpoint if a watchpoint number is specified, or ``nil`` if no
|
||
watchpoint number is specified.
|
||
debug:wpdisable([wp])
|
||
Disable the specified watchpoint, or all watchpoints for the device if no
|
||
watchpoint number is specified. Returns whether the specified number
|
||
matched a watchpoint if a watchpoint number is specified, or ``nil`` if no
|
||
watchpoint number is specified.
|
||
debug:wpclear([wp])
|
||
Clear the specified watchpoint, or all watchpoints for the device if no
|
||
watchpoint number is specified. Returns whether the specified number
|
||
matched a watchpoint if a watchpoint number is specified, or ``nil`` if no
|
||
watchpoint number is specified.
|
||
debug:wplist(space)
|
||
Returns a table of watchpoints for the specified address space of the
|
||
device. The keys are the watchpoint numbers, and the values are
|
||
:ref:`watchpoint objects <luascript-ref-watchpoint>`.
|
||
|
||
|
||
.. _luascript-ref-breakpoint:
|
||
|
||
Breakpoint
|
||
----------
|
||
|
||
Wraps MAME’s ``debug_breakpoint`` class, representing a breakpoint for an
|
||
emulated CPU device.
|
||
|
||
Instantiation
|
||
~~~~~~~~~~~~~
|
||
|
||
manager.machine.devices[tag].debug:bplist()[bp]
|
||
Gets the specified breakpoint for an emulated CPU device, or ``nil`` if no
|
||
breakpoint corresponds to the specified index.
|
||
|
||
Properties
|
||
~~~~~~~~~~
|
||
|
||
breakpoint.index (read-only)
|
||
The breakpoint’s index. The can be used to enable, disable or clear the
|
||
breakpoint via the
|
||
:ref:`CPU debugger interface <luascript-ref-devdebug>`.
|
||
breakpoint.enabled (read/write)
|
||
A Boolean indicating whether the breakpoint is currently enabled.
|
||
breakpoint.address (read-only)
|
||
The breakpoint’s address.
|
||
breakpoint.condition (read-only)
|
||
A debugger expression evaluated each time the breakpoint is hit. The action
|
||
will only be triggered if this expression evaluates to a non-zero value. An
|
||
empty string if no condition was specified.
|
||
breakpoint.action (read-only)
|
||
An action the debugger will run when the breakpoint is hit and the condition
|
||
evaluates to a non-zero value. An empty string if no action was specified.
|
||
|
||
|
||
.. _luascript-ref-watchpoint:
|
||
|
||
Watchpoint
|
||
----------
|
||
|
||
Wraps MAME’s ``debug_watchpoint`` class, representing a watchpoint for an
|
||
emulated CPU device.
|
||
|
||
Instantiation
|
||
~~~~~~~~~~~~~
|
||
|
||
manager.machine.devices[tag].debug:wplist(space)[wp]
|
||
Gets the specified watchpoint for an address space of an emulated CPU
|
||
device, or ``nil`` if no watchpoint in the address space corresponds to the
|
||
specified index.
|
||
|
||
Properties
|
||
~~~~~~~~~~
|
||
|
||
watchpoint.index (read-only)
|
||
The watchpoint’s index. The can be used to enable, disable or clear the
|
||
watchpoint via the
|
||
:ref:`CPU debugger interface <luascript-ref-devdebug>`.
|
||
watchpoint.enabled (read/write)
|
||
A Boolean indicating whether the watchpoint is currently enabled.
|
||
watchpoint.type (read-only)
|
||
Either ``"r"``, ``"w"`` or ``"rw"`` for a read, write or read/write
|
||
watchpoint.
|
||
watchpoint.address (read-only)
|
||
The starting address of the watchpoint’s address range.
|
||
watchpoint.length (read-only)
|
||
The length of the watchpoint’s address range.
|
||
watchpoint.condition (read-only)
|
||
A debugger expression evaluated each time the watchpoint is hit. The action
|
||
will only be triggered if this expression evaluates to a non-zero value. An
|
||
empty string if no condition was specified.
|
||
watchpoint.action (read-only)
|
||
An action the debugger will run when the watchpoint is hit and the condition
|
||
evaluates to a non-zero value. An empty string if no action was specified.
|
||
|
||
|
||
.. _luascript-ref-debugexpressionerror:
|
||
|
||
Expression error
|
||
----------------
|
||
|
||
Wraps MAME’s ``expression_error`` class, describing an error occurring while
|
||
parsing or executing a debugger expression. Raised on errors when using
|
||
:ref:`parsed expressions <luascript-ref-debugexpression>`. Can be converted to
|
||
a string to provide a description of the error.
|
||
|
||
Properties
|
||
~~~~~~~~~~
|
||
|
||
err.code (read-only)
|
||
An implementation-dependent number representing the category of error.
|
||
Should not be displayed to the user.
|
||
err.offset (read-only)
|
||
The offset within the expression string where the error was encountered.
|