GP-4562: once more more...

GP-4562: once more...
GP-4562: once more...
GP-4562: test error
GP-4562: post-review pt4
GP-4562: post-review pt3
GP-4562: post-review pt2
GP-4562: post-review pt1
GP-4562: warnings (Win)
GP-4562: warnings
GP-4562: windows warning
GP-4562: notes
GP-4562: notes
GP-4562: rearranged slightly
GP-4562: clean-up
GP-4562: powershell adds
GP-4562: powershell adds
GP-4562: added task
GP-4562: oops
GP-4562: buildXml
GP-4562: moving stuff
GP-4562: re-generating
GP-4562: gdb (passes tests)
GP-4562: first pass
GP4562: xsltGP-4562: rearrangeGP-4562:  breaking things downGP-4562: basics in placeGP-4562: oops
This commit is contained in:
d-millar
2026-05-08 14:46:06 -04:00
parent dee3703ef6
commit fc988976bf
38 changed files with 2942 additions and 1704 deletions
@@ -9,7 +9,9 @@ src/main/py/LICENSE||GHIDRA||||END|
src/main/py/MANIFEST.in||GHIDRA||||END|
src/main/py/README.md||GHIDRA||||END|
src/main/py/pyproject.toml||GHIDRA||||END|
src/main/py/src/ghidradbg/dbgeng_base.xml||GHIDRA||||END|
src/main/py/src/ghidradbg/dbgmodel/DbgModel.idl||GHIDRA||||END|
src/main/py/src/ghidradbg/exdi/exdi.xml||GHIDRA||||END|
src/main/py/src/ghidradbg/py.typed||GHIDRA||||END|
src/main/py/src/ghidradbg/schema.xml||GHIDRA||||END|
src/main/py/src/ghidradbg/schema_exdi.xml||GHIDRA||||END|
@@ -0,0 +1,49 @@
## ###
# IP: GHIDRA
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##
from merge_xml import merge
import os
import sys
rmi_path = os.getcwd() + "/../../../../../../Debugger-rmi-trace/src/main/py/src/ghidratrace/"
sys.path.append(rmi_path)
def main():
xml = rmi_path+"xml/"
merge(xml_base="dbgeng_base.xml",
xml_out="schema.xml",
xml_updates=[
xml+"sessions.xml",
xml+"common.xml",
xml+"nesting_adjustments.xml",
xml+"available.xml",
xml+"events.xml",
xml+"breakpointsFlat.xml"
])
merge(xml_base="dbgeng_base.xml",
xml_out="schema_exdi.xml",
xml_updates=[
xml+"sessions.xml",
xml+"common.xml",
xml+"nesting_adjustments.xml",
xml+"available.xml",
xml+"events.xml",
xml+"breakpointsFlat.xml",
os.getcwd()+"/exdi/exdi.xml"
])
if __name__ == '__main__':
main()
@@ -245,10 +245,8 @@ def start_trace(name: str) -> None:
if frame is None:
raise AssertionError("cannot locate schema.xml")
parent = os.path.dirname(inspect.getfile(frame))
if util.is_exdi():
schema_fn = os.path.join(parent, 'schema_exdi.xml')
else:
schema_fn = os.path.join(parent, 'schema.xml')
schema_fn = os.path.join(parent, 'schema_exdi.xml' if util.is_exdi() else 'schema.xml')
with open(schema_fn, 'r') as schema_file:
schema_xml = schema_file.read()
using_dbgmodel = os.getenv('OPT_USE_DBGMODEL') == "true"
@@ -0,0 +1,27 @@
<context>
<schema name="DbgRoot" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="EventScope" />
<attribute name="Sessions" schema="SessionContainer" required="yes" fixed="yes" />
<attribute name="Settings" schema="ANY" />
<attribute name="State" schema="State" />
<attribute-alias from="_state" to="State" />
<attribute name="Utility" schema="ANY" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY"/>
</schema>
<schema name="Process" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Debug" schema="DebugBreakpointContainer" required="yes" fixed="yes" />
<attribute name="Handle" schema="STRING" fixed="yes" />
<attribute name="Id" schema="STRING" fixed="yes" />
</schema>
<schema name="Module" elementResync="NEVER" attributeResync="NEVER">
<attribute name="ToDisplayString" schema="BOOL" hidden="yes" />
</schema>
<schema name="MemoryRegion" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Base" schema="LONG" required="yes" fixed="yes" />
</schema>
<schema name="DebugBreakpointContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Breakpoints" schema="BreakpointContainer" required="yes" />
</schema>
</context>
@@ -0,0 +1,93 @@
<context>
<schema name="Session" elementResync="NEVER" attributeResync="NEVER">
<attribute name="ExdiProcesses" schema="ExdiProcessContainer" required="no" fixed="yes" />
<attribute name="Memory" schema="Memory" required="no" fixed="yes" />
<attribute name="Modules" schema="ModuleContainer" required="no" fixed="yes" />
</schema>
<schema name="Process" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Memory" schema="ProcessMemory" required="yes" fixed="yes" />
<attribute name="Modules" schema="ProcessModuleContainer" required="yes" fixed="yes" />
</schema>
<schema name="ProcessModuleContainer" canonical="yes" elementResync="ONCE" attributeResync="NEVER">
<!-- interface name="ModuleContainer" /-->
<element schema="ProcessModule" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="ProcessMemory" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<!-- interface name="Memory" /-->
<element schema="ProcessMemoryRegion" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="ProcessModule" elementResync="NEVER" attributeResync="NEVER">
<!-- interface name="Module" /-->
<element schema="VOID" />
<attribute name="Sections" schema="SectionContainer" required="yes" fixed="yes" />
<attribute name="Symbols" schema="SymbolContainer" required="yes" fixed="yes" />
<attribute name="Range" schema="RANGE" />
<attribute name="Name" schema="STRING" />
<attribute-alias from="_module_name" to="Name" />
<attribute-alias from="_range" to="Range" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute name="ToDisplayString" schema="BOOL" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="ProcessMemoryRegion" elementResync="NEVER" attributeResync="NEVER">
<!-- interface name="MemoryRegion" /-->
<element schema="VOID" />
<attribute name="Base" schema="LONG" required="yes" fixed="yes" />
<attribute name="Object File" schema="STRING" fixed="yes" />
<attribute name="_readable" schema="BOOL" required="yes" hidden="yes" />
<attribute name="_writable" schema="BOOL" required="yes" hidden="yes" />
<attribute name="_executable" schema="BOOL" required="yes" hidden="yes" />
<attribute name="Range" schema="RANGE" required="yes" hidden="yes" />
<attribute-alias from="_range" to="Range" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="ExdiProcessContainer" canonical="yes" elementResync="ONCE" attributeResync="NEVER">
<element schema="ExdiProcess" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute name="_base" schema="INT" />
<attribute schema="VOID" />
</schema>
<schema name="ExdiProcess" elementResync="NEVER" attributeResync="NEVER">
<interface name="Process" />
<interface name="Aggregate" />
<interface name="ExecutionStateful" />
<element schema="VOID" />
<attribute name="Threads" schema="ExdiThreadContainer" required="yes" fixed="yes" />
<!-- attribute name="Modules" schema="ModuleContainer" required="yes" fixed="yes" /-->
<attribute name="PID" schema="LONG" />
<attribute-alias from="_pid" to="PID" />
<attribute name="State" schema="EXECUTION_STATE" required="yes" hidden="yes" />
<attribute-alias from="_state" to="State" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_short_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="OBJECT" />
</schema>
<schema name="ExdiThreadContainer" canonical="yes" elementResync="ONCE" attributeResync="NEVER">
<element schema="ExdiThread" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute name="_base" schema="INT" />
<attribute schema="VOID" />
</schema>
<schema name="ExdiThread" elementResync="NEVER" attributeResync="NEVER">
<interface name="Thread" />
<interface name="ExecutionStateful" />
<interface name="Aggregate" />
<element schema="VOID" />
<attribute name="TID" schema="LONG" />
<attribute-alias from="_tid" to="TID" />
<attribute name="State" schema="EXECUTION_STATE" required="yes" hidden="yes" />
<attribute-alias from="_state" to="State" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_short_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="OBJECT" />
</schema>
</context>
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -10,4 +10,5 @@ src/main/py/LICENSE||GHIDRA||||END|
src/main/py/MANIFEST.in||GHIDRA||||END|
src/main/py/README.md||GHIDRA||||END|
src/main/py/pyproject.toml||GHIDRA||||END|
src/main/py/src/ghidradrgn/drgn_base.xml||GHIDRA||||END|
src/main/py/src/ghidradrgn/schema.xml||GHIDRA||||END|
@@ -0,0 +1,33 @@
## ###
# IP: GHIDRA
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##
from merge_xml import merge
import os
import sys
rmi_path = os.getcwd() + "/../../../../../../Debugger-rmi-trace/src/main/py/src/ghidratrace/"
sys.path.append(rmi_path)
def main():
xml = rmi_path+"xml/"
merge(xml_base="drgn_base.xml",
xml_out="schema.xml",
xml_updates=[
xml+"common.xml"
])
if __name__ == '__main__':
main()
@@ -0,0 +1,39 @@
<context>
<schema name="DrgnRoot" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Processes" schema="ProcessContainer" required="yes" fixed="yes" />
<attribute name="State" schema="ANY" />
<attribute-alias from="_state" to="State" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY"/>
</schema>
<schema name="Process" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Symbols" schema="SymbolContainer" required="yes" fixed="yes" />
<attribute name="Handle" schema="STRING" fixed="yes" />
<attribute name="Id" schema="STRING" fixed="yes" />
</schema>
<schema name="Thread" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Environment" schema="ANY" fixed="yes" />
<attribute name="Id" schema="STRING" fixed="yes" />
</schema>
<schema name="Module" elementResync="NEVER" attributeResync="NEVER">
<attribute name="ToDisplayString" schema="BOOL" hidden="yes" />
</schema>
<schema name="StackFrame" elementResync="NEVER" attributeResync="NEVER">
<attribute name="PC" schema="ADDRESS" required="yes" />
<attribute-alias from="_pc" to="PC" />
<attribute name="SP" schema="ADDRESS" />
<attribute name="Registers" schema="RegisterValueContainer" required="yes" fixed="yes" />
<attribute name="Locals" schema="LocalsContainer" required="yes" fixed="yes" />
</schema>
<schema name="LocalsContainer" attributeResync="ONCE">
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="Local" />
</schema>
<schema name="Local" attributeResync="ONCE">
<attribute name="Address" schema="ADDRESS" />
<attribute name="Kind" schema="ANY" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
</context>
@@ -1,183 +1,198 @@
<?xml version="1.0"?>
<context>
<schema name="DrgnRoot" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Processes" schema="ProcessContainer" required="yes" fixed="yes" />
<attribute name="State" schema="ANY" />
<attribute-alias from="_state" to="State" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY"/>
</schema>
<schema name="Selectable" elementResync="NEVER" attributeResync="NEVER">
<element schema="OBJECT" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="ProcessContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Process" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="Process" elementResync="NEVER" attributeResync="NEVER">
<interface name="Activatable" />
<interface name="Process" />
<interface name="Aggregate" />
<interface name="ExecutionStateful" />
<element schema="VOID" />
<attribute name="Threads" schema="ThreadContainer" required="yes" fixed="yes" />
<attribute name="Symbols" schema="SymbolContainer" required="yes" fixed="yes" />
<attribute name="Exit Code" schema="LONG" />
<attribute-alias from="_exit_code" to="Exit Code" />
<attribute name="Environment" schema="Environment" required="yes" fixed="yes" />
<attribute name="Memory" schema="Memory" required="yes" fixed="yes" />
<attribute name="Modules" schema="ModuleContainer" required="yes" fixed="yes" />
<attribute name="Handle" schema="STRING" fixed="yes" />
<attribute name="Id" schema="STRING" fixed="yes" />
<attribute name="PID" schema="LONG" hidden="yes" />
<attribute-alias from="_pid" to="PID" />
<attribute name="State" schema="EXECUTION_STATE" required="yes" hidden="yes" />
<attribute-alias from="_state" to="State" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_short_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="Environment" elementResync="NEVER" attributeResync="NEVER">
<interface name="Environment" />
<element schema="VOID" />
<attribute name="OS" schema="STRING" />
<attribute name="Arch" schema="STRING" />
<attribute name="Endian" schema="STRING" />
<attribute name="Debugger" schema="STRING" />
<attribute-alias from="_os" to="OS" />
<attribute-alias from="_arch" to="Arch" />
<attribute-alias from="_endian" to="Endian" />
<attribute-alias from="_debugger" to="Debugger" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="ModuleContainer" canonical="yes" elementResync="ONCE" attributeResync="NEVER">
<element schema="Module" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="Memory" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="Memory" />
<element schema="MemoryRegion" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="ThreadContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Thread" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="Thread" elementResync="NEVER" attributeResync="NEVER">
<interface name="Activatable" />
<interface name="Thread" />
<interface name="ExecutionStateful" />
<interface name="Aggregate" />
<element schema="VOID" />
<attribute name="Stack" schema="Stack" required="yes" fixed="yes" />
<attribute name="Environment" schema="ANY" fixed="yes" />
<attribute name="Id" schema="STRING" fixed="yes" />
<attribute name="TID" schema="LONG" />
<attribute-alias from="_tid" to="TID" />
<attribute name="State" schema="EXECUTION_STATE" required="yes" hidden="yes" />
<attribute-alias from="_state" to="State" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_short_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="Module" elementResync="NEVER" attributeResync="NEVER">
<interface name="Module" />
<element schema="VOID" />
<attribute name="Sections" schema="SectionContainer" required="yes" fixed="yes" />
<attribute name="Symbols" schema="SymbolContainer" required="yes" fixed="yes" />
<attribute name="Range" schema="RANGE" />
<attribute name="Name" schema="STRING" />
<attribute-alias from="_module_name" to="Name" />
<attribute-alias from="_range" to="Range" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute name="ToDisplayString" schema="BOOL" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="MemoryRegion" elementResync="NEVER" attributeResync="NEVER">
<interface name="MemoryRegion" />
<element schema="VOID" />
<attribute name="Object File" schema="STRING" fixed="yes" />
<attribute name="_readable" schema="BOOL" required="yes" hidden="yes" />
<attribute name="_writable" schema="BOOL" required="yes" hidden="yes" />
<attribute name="_executable" schema="BOOL" required="yes" hidden="yes" />
<attribute name="Range" schema="RANGE" required="yes" />
<attribute-alias from="_range" to="Range" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="SectionContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Section" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Stack" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="Stack" />
<element schema="StackFrame" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="SymbolContainer" canonical="yes" elementResync="ONCE" attributeResync="NEVER">
<element schema="Symbol" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Symbol" elementResync="NEVER" attributeResync="NEVER">
<element schema="VOID" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="StackFrame" elementResync="NEVER" attributeResync="NEVER">
<interface name="Activatable" />
<interface name="StackFrame" />
<interface name="Aggregate" />
<element schema="VOID" />
<attribute name="Function" schema="STRING" hidden="yes" />
<attribute-alias from="_function" to="Function" />
<attribute name="PC" schema="ADDRESS" required="yes" />
<attribute-alias from="_pc" to="PC" />
<attribute name="SP" schema="ADDRESS" />
<attribute name="Registers" schema="RegisterValueContainer" required="yes" fixed="yes" />
<attribute name="Locals" schema="LocalsContainer" required="yes" fixed="yes" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="Section" elementResync="NEVER" attributeResync="NEVER">
<interface name="Section" />
<element schema="VOID" />
<attribute name="Range" schema="RANGE" />
<attribute-alias from="_range" to="Range" />
<attribute name="Offset" schema="STRING" fixed="yes" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="RegisterValueContainer" attributeResync="ONCE">
<interface name="RegisterContainer" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="LocalsContainer" attributeResync="ONCE">
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="Local" />
</schema>
<schema name="Local" attributeResync="ONCE">
<attribute name="Address" schema="ADDRESS" />
<attribute name="Kind" schema="ANY" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
</context>
<!--This file was autogenerated using build_xml. DO NOT EDIT.-->
<schema name="DrgnRoot" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Processes" schema="ProcessContainer" required="yes" fixed="yes"/>
<attribute name="State" schema="ANY"/>
<attribute-alias from="_state" to="State"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="Process" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Symbols" schema="SymbolContainer" required="yes" fixed="yes"/>
<attribute name="Handle" schema="STRING" fixed="yes"/>
<attribute name="Id" schema="STRING" fixed="yes"/>
<interface name="Activatable"/>
<interface name="Process"/>
<interface name="Aggregate"/>
<interface name="ExecutionStateful"/>
<element schema="VOID"/>
<attribute name="Threads" schema="ThreadContainer" required="yes" fixed="yes"/>
<attribute name="Exit Code" schema="LONG"/>
<attribute-alias from="_exit_code" to="Exit Code"/>
<attribute name="Environment" schema="Environment" required="yes" fixed="yes"/>
<attribute name="Memory" schema="Memory" required="yes" fixed="yes"/>
<attribute name="Modules" schema="ModuleContainer" required="yes" fixed="yes"/>
<attribute name="PID" schema="LONG" hidden="yes"/>
<attribute-alias from="_pid" to="PID"/>
<attribute name="State" schema="EXECUTION_STATE" required="yes" hidden="yes"/>
<attribute-alias from="_state" to="State"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_short_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="Thread" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Environment" schema="ANY" fixed="yes"/>
<attribute name="Id" schema="STRING" fixed="yes"/>
<interface name="Activatable"/>
<interface name="Thread"/>
<interface name="ExecutionStateful"/>
<interface name="Aggregate"/>
<element schema="VOID"/>
<attribute name="Stack" schema="Stack" required="yes" fixed="yes"/>
<attribute name="TID" schema="LONG"/>
<attribute-alias from="_tid" to="TID"/>
<attribute name="State" schema="EXECUTION_STATE" required="yes" hidden="yes"/>
<attribute-alias from="_state" to="State"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_short_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="Module" elementResync="NEVER" attributeResync="NEVER">
<attribute name="ToDisplayString" schema="BOOL" hidden="yes"/>
<interface name="Module"/>
<element schema="VOID"/>
<attribute name="Sections" schema="SectionContainer" required="yes" fixed="yes"/>
<attribute name="Symbols" schema="SymbolContainer" required="yes" fixed="yes"/>
<attribute name="Name" schema="STRING"/>
<attribute-alias from="_module_name" to="Name"/>
<attribute name="Range" schema="RANGE"/>
<attribute-alias from="_range" to="Range"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="StackFrame" elementResync="NEVER" attributeResync="NEVER">
<attribute name="PC" schema="ADDRESS" required="yes"/>
<attribute-alias from="_pc" to="PC"/>
<attribute name="SP" schema="ADDRESS"/>
<attribute name="Registers" schema="RegisterValueContainer" required="yes" fixed="yes"/>
<attribute name="Locals" schema="LocalsContainer" required="yes" fixed="yes"/>
<interface name="Activatable"/>
<interface name="StackFrame"/>
<interface name="Aggregate"/>
<element schema="VOID"/>
<attribute name="Function" schema="STRING" hidden="yes"/>
<attribute-alias from="_function" to="Function"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="LocalsContainer" attributeResync="ONCE">
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="Local"/>
</schema>
<schema name="Local" attributeResync="ONCE">
<attribute name="Address" schema="ADDRESS"/>
<attribute name="Kind" schema="ANY" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="Selectable" elementResync="NEVER" attributeResync="NEVER">
<element schema="OBJECT"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="State" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="VOID"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="ProcessContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Process"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="Environment" elementResync="NEVER" attributeResync="NEVER">
<interface name="Environment"/>
<element schema="VOID"/>
<attribute name="OS" schema="STRING"/>
<attribute name="Arch" schema="STRING"/>
<attribute name="Endian" schema="STRING"/>
<attribute name="Debugger" schema="STRING"/>
<attribute-alias from="_os" to="OS"/>
<attribute-alias from="_arch" to="Arch"/>
<attribute-alias from="_endian" to="Endian"/>
<attribute-alias from="_debugger" to="Debugger"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="ModuleContainer" canonical="yes" elementResync="ONCE" attributeResync="NEVER">
<element schema="Module"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="Memory" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="Memory"/>
<element schema="MemoryRegion"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="ThreadContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Thread"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="MemoryRegion" elementResync="NEVER" attributeResync="NEVER">
<interface name="MemoryRegion"/>
<element schema="VOID"/>
<attribute name="Offset" schema="STRING" fixed="yes"/>
<attribute-alias from="_offset" to="Offset"/>
<attribute name="Object File" schema="STRING" fixed="yes"/>
<attribute-alias from="_objfile" to="Object File"/>
<attribute name="Range" schema="RANGE" required="yes"/>
<attribute-alias from="_range" to="Range"/>
<attribute name="_readable" schema="BOOL" required="yes" hidden="yes"/>
<attribute name="_writable" schema="BOOL" required="yes" hidden="yes"/>
<attribute name="_executable" schema="BOOL" required="yes" hidden="yes"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="SectionContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Section"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="Stack" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="Stack"/>
<element schema="StackFrame"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="SymbolContainer" canonical="yes" elementResync="ONCE" attributeResync="NEVER">
<element schema="Symbol"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="Symbol" elementResync="NEVER" attributeResync="NEVER">
<element schema="VOID"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="Section" elementResync="NEVER" attributeResync="NEVER">
<interface name="Section"/>
<element schema="VOID"/>
<attribute name="Range" schema="RANGE"/>
<attribute-alias from="_range" to="Range"/>
<attribute name="Offset" schema="STRING" fixed="yes"/>
<attribute-alias from="_offset" to="Offset"/>
<attribute name="Module" schema="Module" fixed="yes" hidden="yes"/>
<attribute-alias from="_module" to="Module"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="RegisterValueContainer" canonical="yes" attributeResync="ONCE">
<interface name="RegisterContainer"/>
<attribute name="_order" schema="INT" hidden="yes"/>
</schema>
<schema name="Register">
<interface name="Register"/>
<attribute schema="ANY"/>
</schema>
</context>
@@ -14,6 +14,7 @@ src/main/py/LICENSE||GHIDRA||||END|
src/main/py/MANIFEST.in||GHIDRA||||END|
src/main/py/README.md||GHIDRA||||END|
src/main/py/pyproject.toml||GHIDRA||||END|
src/main/py/src/ghidragdb/gdb_base.xml||GHIDRA||||END|
src/main/py/src/ghidragdb/py.typed||GHIDRA||||END|
src/main/py/src/ghidragdb/schema.xml||GHIDRA||||END|
src/main/py/tests/EMPTY||GHIDRA||||END|
@@ -0,0 +1,35 @@
## ###
# IP: GHIDRA
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##
from merge_xml import merge
import os
import sys
rmi_path = os.getcwd() + "/../../../../../../Debugger-rmi-trace/src/main/py/src/ghidratrace/"
sys.path.append(rmi_path)
def main():
xml = rmi_path+"xml/"
merge(xml_base="gdb_base.xml",
xml_out="schema.xml",
xml_updates=[
xml+"common.xml",
xml+"available.xml",
xml+"breakpointsTiered.xml"
])
if __name__ == '__main__':
main()
@@ -296,10 +296,12 @@ def start_trace(name: str) -> None:
frame = inspect.currentframe()
if frame is None:
raise AssertionError("cannot locate schema.xml")
parent = os.path.dirname(inspect.getfile(frame))
schema_fn = os.path.join(parent, 'schema.xml')
with open(schema_fn, 'r') as schema_file:
schema_xml = schema_file.read()
with STATE.trace.open_tx("Create Root Object"):
root = STATE.trace.create_root_object(schema_xml, 'GdbSession')
root.set_value('_display', 'GNU gdb ' + util.GDB_VERSION.full)
@@ -0,0 +1,28 @@
<context>
<schema name="GdbSession" elementResync="NEVER" attributeResync="NEVER">
<interface name="EventScope" />
<interface name="FocusScope" />
<interface name="Aggregate" />
<element schema="VOID" />
<attribute name="Inferiors" schema="ProcessContainer" required="yes" fixed="yes" />
<attribute name="Available" schema="AvailableContainer" required="yes" fixed="yes" />
<attribute name="Breakpoints" schema="BreakpointContainer" required="yes" fixed="yes" />
<attribute name="_event_thread" schema="OBJECT" hidden="yes" />
<attribute name="_focus" schema="Selectable" required="yes" hidden="yes" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Process" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Breakpoints" schema="BreakpointLocationContainer" required="yes" fixed="yes" />
</schema>
<schema name="StackFrame" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Registers" schema="RegisterValueContainer" required="yes" fixed="yes" />
<attribute name="PC" schema="ADDRESS" required="yes" />
<attribute-alias from="_pc" to="PC" />
</schema>
<schema name="RegisterValueContainer" attributeResync="ONCE">
<attribute schema="Register" />
</schema>
</context>
@@ -310,11 +310,11 @@ class Environment(TraceObject):
pass
class Inferior(TraceObject):
class Process(TraceObject):
pass
class InferiorContainer(TraceObject):
class ProcessContainer(TraceObject):
pass
@@ -372,7 +372,7 @@ def refresh_breakpoints(node: BreakpointContainer) -> None:
@REGISTRY.method(action='refresh', display='Refresh Inferiors')
def refresh_inferiors(node: InferiorContainer) -> None:
def refresh_inferiors(node: ProcessContainer) -> None:
"""Refresh the list of inferiors."""
with commands.open_tracked_tx('Refresh Inferiors'):
gdb.execute('ghidra trace put-inferiors')
@@ -461,7 +461,7 @@ def refresh_sections(node: Module) -> None:
@REGISTRY.method(action='activate', display="Activate Inferior")
def activate_inferior(inferior: Inferior) -> None:
def activate_inferior(inferior: Process) -> None:
"""Switch to the inferior."""
switch_inferior(find_inf_by_obj(inferior))
@@ -481,13 +481,13 @@ def activate_frame(frame: StackFrame) -> None:
@REGISTRY.method(display='Add Inferior')
def add_inferior(container: InferiorContainer) -> None:
def add_inferior(container: ProcessContainer) -> None:
"""Add a new inferior."""
gdb.execute('add-inferior')
@REGISTRY.method(action='delete', display="Delete Inferior")
def delete_inferior(inferior: Inferior) -> None:
def delete_inferior(inferior: Process) -> None:
"""Remove the inferior."""
inf = find_inf_by_obj(inferior)
gdb.execute(f'remove-inferior {inf.num}')
@@ -495,7 +495,7 @@ def delete_inferior(inferior: Inferior) -> None:
# TODO: Separate method for each of core, exec, remote, etc...?
@REGISTRY.method(display='Connect Target')
def connect(inferior: Inferior, spec: str) -> None:
def connect(inferior: Process, spec: str) -> None:
"""Connect to a target machine or process."""
switch_inferior(find_inf_by_obj(inferior))
gdb.execute(f'target {spec}')
@@ -510,21 +510,21 @@ def attach_obj(target: Attachable) -> None:
@REGISTRY.method(action='attach', display='Attach by PID')
def attach_pid(inferior: Inferior, pid: int) -> None:
def attach_pid(inferior: Process, pid: int) -> None:
"""Attach the inferior to the given target."""
switch_inferior(find_inf_by_obj(inferior))
gdb.execute(f'attach {pid}')
@REGISTRY.method(display='Detach')
def detach(inferior: Inferior) -> None:
def detach(inferior: Process) -> None:
"""Detach the inferior's target."""
switch_inferior(find_inf_by_obj(inferior))
gdb.execute('detach')
@REGISTRY.method(action='launch', display='Launch at main')
def launch_main(inferior: Inferior,
def launch_main(inferior: Process,
file: Annotated[str, ParamDesc(display='File')],
args: Annotated[str, ParamDesc(display='Arguments')] = '') -> None:
"""Start a native process with the given command line, stopping at 'main'
@@ -542,7 +542,7 @@ def launch_main(inferior: Inferior,
@REGISTRY.method(action='launch', display='Launch at Loader',
condition=util.GDB_VERSION.major >= 9)
def launch_loader(inferior: Inferior,
def launch_loader(inferior: Process,
file: Annotated[str, ParamDesc(display='File')],
args: Annotated[str, ParamDesc(display='Arguments')] = '') -> None:
"""Start a native process with the given command line, stopping at first
@@ -556,7 +556,7 @@ def launch_loader(inferior: Inferior,
@REGISTRY.method(action='launch', display='Launch and Run')
def launch_run(inferior: Inferior,
def launch_run(inferior: Process,
file: Annotated[str, ParamDesc(display='File')],
args: Annotated[str, ParamDesc(display='Arguments')] = '') -> None:
"""Run a native process with the given command line (run).
@@ -573,7 +573,7 @@ def launch_run(inferior: Inferior,
@REGISTRY.method()
def kill(inferior: Inferior) -> None:
def kill(inferior: Process) -> None:
"""Kill execution of the inferior."""
switch_inferior(find_inf_by_obj(inferior))
with no_confirm():
@@ -581,7 +581,7 @@ def kill(inferior: Inferior) -> None:
@REGISTRY.method()
def resume(inferior: Inferior) -> None:
def resume(inferior: Process) -> None:
"""Continue execution of the inferior."""
switch_inferior(find_inf_by_obj(inferior))
gdb.execute('continue')
@@ -589,7 +589,7 @@ def resume(inferior: Inferior) -> None:
@REGISTRY.method(action='step_ext', icon='icon.debugger.resume.back',
condition=util.IS_TRACE)
def resume_back(inferior: Inferior) -> None:
def resume_back(inferior: Process) -> None:
"""Continue execution of the inferior backwards."""
gdb.execute('reverse-continue')
@@ -598,7 +598,7 @@ def resume_back(inferior: Inferior) -> None:
# is the current inferior. This in turn queues the UI to enable or disable the
# button appropriately
@REGISTRY.method()
def interrupt(inferior: Inferior) -> None:
def interrupt(inferior: Process) -> None:
"""Interrupt the execution of the debugged program."""
gdb.execute('interrupt')
@@ -663,7 +663,7 @@ def step_back_over(thread: Thread,
@REGISTRY.method(action='break_sw_execute')
def break_sw_execute_address(inferior: Inferior, address: Address) -> None:
def break_sw_execute_address(inferior: Process, address: Address) -> None:
"""Set a breakpoint (break)."""
inf = find_inf_by_obj(inferior)
offset = inferior.trace.extra.require_mm().map_back(inf, address)
@@ -678,7 +678,7 @@ def break_sw_execute_expression(expression: str) -> None:
@REGISTRY.method(action='break_hw_execute')
def break_hw_execute_address(inferior: Inferior, address: Address) -> None:
def break_hw_execute_address(inferior: Process, address: Address) -> None:
"""Set a hardware-assisted breakpoint (hbreak)."""
inf = find_inf_by_obj(inferior)
offset = inferior.trace.extra.require_mm().map_back(inf, address)
@@ -693,7 +693,7 @@ def break_hw_execute_expression(expression: str) -> None:
@REGISTRY.method(action='break_read')
def break_read_range(inferior: Inferior, range: AddressRange) -> None:
def break_read_range(inferior: Process, range: AddressRange) -> None:
"""Set a read watchpoint (rwatch)."""
inf = find_inf_by_obj(inferior)
offset_start = inferior.trace.extra.require_mm().map_back(
@@ -709,7 +709,7 @@ def break_read_expression(expression: str) -> None:
@REGISTRY.method(action='break_write')
def break_write_range(inferior: Inferior, range: AddressRange) -> None:
def break_write_range(inferior: Process, range: AddressRange) -> None:
"""Set a watchpoint (watch)."""
inf = find_inf_by_obj(inferior)
offset_start = inferior.trace.extra.require_mm().map_back(
@@ -725,7 +725,7 @@ def break_write_expression(expression: str) -> None:
@REGISTRY.method(action='break_access')
def break_access_range(inferior: Inferior, range: AddressRange) -> None:
def break_access_range(inferior: Process, range: AddressRange) -> None:
"""Set an access watchpoint (awatch)."""
inf = find_inf_by_obj(inferior)
offset_start = inferior.trace.extra.require_mm().map_back(
@@ -741,7 +741,7 @@ def break_access_expression(expression: str) -> None:
@REGISTRY.method(action='break_ext', display='Catch Event')
def break_ext_event(inferior: Inferior,
def break_ext_event(inferior: Process,
spec: Annotated[str, ParamDesc(display='Type')]) -> None:
"""Set a generic catchpoint (catch)."""
gdb.execute(f'catch {spec}')
@@ -756,7 +756,7 @@ def break_event(container: BreakpointContainer,
@REGISTRY.method(action='break_ext', display='Catch Signal')
def break_ext_signal(inferior: Inferior, signal: Annotated[
def break_ext_signal(inferior: Process, signal: Annotated[
str, ParamDesc(display='Signal (opt)')]) -> None:
"""Set a signal catchpoint (catch signal)."""
gdb.execute(f'catch signal {signal}')
@@ -770,7 +770,7 @@ def break_signal(container: BreakpointContainer, signal: Annotated[
@REGISTRY.method(action='break_ext', display='Catch Syscall')
def break_ext_syscall(inferior: Inferior, syscall: Annotated[
def break_ext_syscall(inferior: Process, syscall: Annotated[
str, ParamDesc(display='Syscall (opt)')]) -> None:
"""Set a syscall catchpoint (catch syscall))."""
gdb.execute(f'catch syscall {syscall}')
@@ -784,7 +784,7 @@ def break_syscall(container: BreakpointContainer, syscall: Annotated[
@REGISTRY.method(action='break_ext', display='Catch Load')
def break_ext_load(inferior: Inferior, library: Annotated[
def break_ext_load(inferior: Process, library: Annotated[
str, ParamDesc(display='Library (opt)')]) -> None:
"""Set a load catchpoint (catch load))."""
gdb.execute(f'catch load {library}')
@@ -798,7 +798,7 @@ def break_load(container: BreakpointContainer, library: Annotated[
@REGISTRY.method(action='break_ext', display='Catch Unload')
def break_ext_unload(inferior: Inferior,
def break_ext_unload(inferior: Process,
library: Annotated[
str, ParamDesc(display='Library (opt)')]) -> None:
"""Set a unload catchpoint (catch unload))."""
@@ -813,7 +813,7 @@ def break_unload(container: BreakpointContainer, library: Annotated[
@REGISTRY.method(action='break_ext', display='Catch Catch')
def break_ext_catch(inferior: Inferior, exception: Annotated[
def break_ext_catch(inferior: Process, exception: Annotated[
str, ParamDesc(display='Exception (opt)')]) -> None:
"""Set a catch catchpoint (catch catch))."""
gdb.execute(f'catch catch {exception}')
@@ -827,7 +827,7 @@ def break_catch(container: BreakpointContainer, exception: Annotated[
@REGISTRY.method(action='break_ext', display='Catch Throw')
def break_ext_throw(inferior: Inferior, exception: Annotated[
def break_ext_throw(inferior: Process, exception: Annotated[
str, ParamDesc(display='Exception (opt)')]) -> None:
"""Set a throw catchpoint (catch throw))."""
gdb.execute(f'catch throw {exception}')
@@ -841,7 +841,7 @@ def break_throw(container: BreakpointContainer, exception: Annotated[
@REGISTRY.method(action='break_ext', display='Catch Rethrow')
def break_ext_rethrow(inferior: Inferior, exception: Annotated[
def break_ext_rethrow(inferior: Process, exception: Annotated[
str, ParamDesc(display='Exception (opt)')]) -> None:
"""Set a rethrow catchpoint (catch rethrow))."""
gdb.execute(f'catch rethrow {exception}')
@@ -902,7 +902,7 @@ def delete_breakpoint(breakpoint: BreakpointSpec) -> None:
@REGISTRY.method()
def read_mem(inferior: Inferior, range: AddressRange) -> None:
def read_mem(inferior: Process, range: AddressRange) -> None:
"""Read memory."""
inf = find_inf_by_obj(inferior)
offset_start = inferior.trace.extra.require_mm().map_back(
@@ -917,7 +917,7 @@ def read_mem(inferior: Inferior, range: AddressRange) -> None:
@REGISTRY.method()
def write_mem(inferior: Inferior, address: Address, data: bytes) -> None:
def write_mem(inferior: Process, address: Address, data: bytes) -> None:
"""Write memory."""
inf = find_inf_by_obj(inferior)
offset = inferior.trace.extra.require_mm().map_back(inf, address)
@@ -1,233 +1,243 @@
<?xml version="1.0"?>
<context>
<schema name="GdbSession" elementResync="NEVER" attributeResync="NEVER">
<interface name="EventScope" />
<interface name="FocusScope" />
<interface name="Aggregate" />
<element schema="VOID" />
<attribute name="Inferiors" schema="InferiorContainer" required="yes" fixed="yes" />
<attribute name="Available" schema="AvailableContainer" required="yes" fixed="yes" />
<attribute name="Breakpoints" schema="BreakpointContainer" required="yes" fixed="yes" />
<attribute name="_event_thread" schema="OBJECT" hidden="yes" />
<attribute name="_focus" schema="Selectable" required="yes" hidden="yes" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Selectable" elementResync="NEVER" attributeResync="NEVER">
<element schema="OBJECT" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="BreakpointContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="BreakpointSpec" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="AvailableContainer" canonical="yes" elementResync="ALWAYS" attributeResync="NEVER">
<element schema="Attachable" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="InferiorContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Inferior" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="BreakpointSpec" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="BreakpointSpec" />
<interface name="Togglable" />
<element schema="BreakpointLocation" />
<attribute name="Expression" schema="STRING" required="yes" hidden="yes" />
<attribute-alias from="_expression" to="Expression" />
<attribute name="Kinds" schema="STRING" required="yes" hidden="yes" />
<attribute-alias from="_kinds" to="Kinds" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute name="Enabled" schema="BOOL" />
<attribute-alias from="_enabled" to="Enabled" />
<attribute name="Commands" schema="STRING" />
<attribute name="Condition" schema="STRING" />
<attribute name="Hit Count" schema="INT" />
<attribute name="Ignore Count" schema="INT" />
<attribute name="Pending" schema="BOOL" />
<attribute name="Silent" schema="BOOL" />
<attribute name="Temporary" schema="BOOL" />
<attribute schema="VOID" />
</schema>
<schema name="Attachable" elementResync="NEVER" attributeResync="NEVER">
<element schema="VOID" />
<attribute name="PID" schema="LONG" />
<attribute-alias from="_pid" to="PID" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Inferior" elementResync="NEVER" attributeResync="NEVER">
<interface name="Activatable" />
<interface name="Process" />
<interface name="Aggregate" />
<interface name="ExecutionStateful" />
<element schema="VOID" />
<attribute name="Threads" schema="ThreadContainer" required="yes" fixed="yes" />
<attribute name="Breakpoints" schema="BreakpointLocationContainer" required="yes" fixed="yes" />
<attribute name="Exit Code" schema="LONG" />
<attribute-alias from="_exit_code" to="Exit Code" />
<attribute name="Environment" schema="Environment" required="yes" fixed="yes" />
<attribute name="Memory" schema="Memory" required="yes" fixed="yes" />
<attribute name="Modules" schema="ModuleContainer" required="yes" fixed="yes" />
<attribute name="PID" schema="LONG" hidden="yes" />
<attribute-alias from="_pid" to="PID" />
<attribute name="State" schema="EXECUTION_STATE" required="yes" hidden="yes" />
<attribute-alias from="_state" to="State" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_short_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Environment" elementResync="NEVER" attributeResync="NEVER">
<interface name="Environment" />
<element schema="VOID" />
<attribute name="OS" schema="STRING" />
<attribute name="Arch" schema="STRING" />
<attribute name="Endian" schema="STRING" />
<attribute name="Debugger" schema="STRING" />
<attribute-alias from="_os" to="OS" />
<attribute-alias from="_arch" to="Arch" />
<attribute-alias from="_endian" to="Endian" />
<attribute-alias from="_debugger" to="Debugger" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="ModuleContainer" canonical="yes" elementResync="ONCE" attributeResync="NEVER">
<element schema="Module" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Memory" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="Memory" />
<element schema="MemoryRegion" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="BreakpointLocation" elementResync="NEVER" attributeResync="NEVER">
<interface name="BreakpointLocation" />
<element schema="VOID" />
<attribute name="Enabled" schema="BOOL" />
<attribute-alias from="_enabled" to="Enabled" />
<attribute name="Range" schema="RANGE" />
<attribute-alias from="_range" to="Range" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="BreakpointLocationContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="BreakpointLocation" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="ThreadContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Thread" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Thread" elementResync="NEVER" attributeResync="NEVER">
<interface name="Activatable" />
<interface name="Thread" />
<interface name="ExecutionStateful" />
<interface name="Aggregate" />
<element schema="VOID" />
<attribute name="Stack" schema="Stack" required="yes" fixed="yes" />
<attribute name="TID" schema="LONG" />
<attribute-alias from="_tid" to="TID" />
<attribute name="State" schema="EXECUTION_STATE" required="yes" hidden="yes" />
<attribute-alias from="_state" to="State" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_short_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Module" elementResync="NEVER" attributeResync="NEVER">
<interface name="Module" />
<element schema="VOID" />
<attribute name="Sections" schema="SectionContainer" required="yes" fixed="yes" />
<attribute name="Symbols" schema="SymbolContainer" required="yes" fixed="yes" />
<attribute name="Range" schema="RANGE" />
<attribute name="Name" schema="STRING" />
<attribute-alias from="_module_name" to="Name" />
<attribute-alias from="_range" to="Range" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="MemoryRegion" elementResync="NEVER" attributeResync="NEVER">
<interface name="MemoryRegion" />
<element schema="VOID" />
<attribute name="Offset" schema="STRING" fixed="yes" />
<attribute-alias from="_offset" to="Offset" />
<attribute name="Object File" schema="STRING" fixed="yes" />
<attribute-alias from="_objfile" to="Object File" />
<attribute name="_readable" schema="BOOL" required="yes" hidden="yes" />
<attribute name="_writable" schema="BOOL" required="yes" hidden="yes" />
<attribute name="_executable" schema="BOOL" required="yes" hidden="yes" />
<attribute name="Range" schema="RANGE" required="yes" hidden="yes" />
<attribute-alias from="_range" to="Range" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="SectionContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Section" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Stack" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="Stack" />
<element schema="StackFrame" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="SymbolContainer" canonical="yes" elementResync="ONCE" attributeResync="NEVER">
<element schema="Symbol" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Symbol" elementResync="NEVER" attributeResync="NEVER">
<element schema="VOID" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="StackFrame" elementResync="NEVER" attributeResync="NEVER">
<interface name="Activatable" />
<interface name="StackFrame" />
<interface name="Aggregate" />
<element schema="VOID" />
<attribute name="Registers" schema="RegisterValueContainer" required="yes" fixed="yes" />
<attribute name="PC" schema="ADDRESS" required="yes" />
<attribute-alias from="_pc" to="PC" />
<attribute name="Function" schema="STRING" hidden="yes" />
<attribute-alias from="_function" to="Function" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Section" elementResync="NEVER" attributeResync="NEVER">
<interface name="Section" />
<element schema="VOID" />
<attribute name="Range" schema="RANGE" />
<attribute name="Module" schema="Module" required="yes" fixed="yes" hidden="yes" />
<attribute-alias from="_range" to="Range" />
<attribute name="Offset" schema="STRING" fixed="yes" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="RegisterValueContainer" attributeResync="NEVER">
<interface name="RegisterContainer" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="Register" />
</schema>
<schema name="Register">
<interface name="Register" />
</schema>
</context>
<!--This file was autogenerated using build_xml. DO NOT EDIT.-->
<schema name="GdbSession" elementResync="NEVER" attributeResync="NEVER">
<interface name="EventScope"/>
<interface name="FocusScope"/>
<interface name="Aggregate"/>
<element schema="VOID"/>
<attribute name="Inferiors" schema="ProcessContainer" required="yes" fixed="yes"/>
<attribute name="Available" schema="AvailableContainer" required="yes" fixed="yes"/>
<attribute name="Breakpoints" schema="BreakpointContainer" required="yes" fixed="yes"/>
<attribute name="_event_thread" schema="OBJECT" hidden="yes"/>
<attribute name="_focus" schema="Selectable" required="yes" hidden="yes"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="Process" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Breakpoints" schema="BreakpointLocationContainer" required="yes" fixed="yes"/>
<interface name="Activatable"/>
<interface name="Process"/>
<interface name="Aggregate"/>
<interface name="ExecutionStateful"/>
<element schema="VOID"/>
<attribute name="Threads" schema="ThreadContainer" required="yes" fixed="yes"/>
<attribute name="Exit Code" schema="LONG"/>
<attribute-alias from="_exit_code" to="Exit Code"/>
<attribute name="Environment" schema="Environment" required="yes" fixed="yes"/>
<attribute name="Memory" schema="Memory" required="yes" fixed="yes"/>
<attribute name="Modules" schema="ModuleContainer" required="yes" fixed="yes"/>
<attribute name="PID" schema="LONG" hidden="yes"/>
<attribute-alias from="_pid" to="PID"/>
<attribute name="State" schema="EXECUTION_STATE" required="yes" hidden="yes"/>
<attribute-alias from="_state" to="State"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_short_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="StackFrame" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Registers" schema="RegisterValueContainer" required="yes" fixed="yes"/>
<attribute name="PC" schema="ADDRESS" required="yes"/>
<attribute-alias from="_pc" to="PC"/>
<interface name="Activatable"/>
<interface name="StackFrame"/>
<interface name="Aggregate"/>
<element schema="VOID"/>
<attribute name="Function" schema="STRING" hidden="yes"/>
<attribute-alias from="_function" to="Function"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="RegisterValueContainer" attributeResync="ONCE">
<attribute schema="Register"/>
<interface name="RegisterContainer"/>
<attribute name="_order" schema="INT" hidden="yes"/>
</schema>
<schema name="Selectable" elementResync="NEVER" attributeResync="NEVER">
<element schema="OBJECT"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="State" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="VOID"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="ProcessContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Process"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="Environment" elementResync="NEVER" attributeResync="NEVER">
<interface name="Environment"/>
<element schema="VOID"/>
<attribute name="OS" schema="STRING"/>
<attribute name="Arch" schema="STRING"/>
<attribute name="Endian" schema="STRING"/>
<attribute name="Debugger" schema="STRING"/>
<attribute-alias from="_os" to="OS"/>
<attribute-alias from="_arch" to="Arch"/>
<attribute-alias from="_endian" to="Endian"/>
<attribute-alias from="_debugger" to="Debugger"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="ModuleContainer" canonical="yes" elementResync="ONCE" attributeResync="NEVER">
<element schema="Module"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="Memory" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="Memory"/>
<element schema="MemoryRegion"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="ThreadContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Thread"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="Thread" elementResync="NEVER" attributeResync="NEVER">
<interface name="Activatable"/>
<interface name="Thread"/>
<interface name="ExecutionStateful"/>
<interface name="Aggregate"/>
<element schema="VOID"/>
<attribute name="Stack" schema="Stack" required="yes" fixed="yes"/>
<attribute name="TID" schema="LONG"/>
<attribute-alias from="_tid" to="TID"/>
<attribute name="State" schema="EXECUTION_STATE" required="yes" hidden="yes"/>
<attribute-alias from="_state" to="State"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_short_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="Module" elementResync="NEVER" attributeResync="NEVER">
<interface name="Module"/>
<element schema="VOID"/>
<attribute name="Sections" schema="SectionContainer" required="yes" fixed="yes"/>
<attribute name="Symbols" schema="SymbolContainer" required="yes" fixed="yes"/>
<attribute name="Name" schema="STRING"/>
<attribute-alias from="_module_name" to="Name"/>
<attribute name="Range" schema="RANGE"/>
<attribute-alias from="_range" to="Range"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="MemoryRegion" elementResync="NEVER" attributeResync="NEVER">
<interface name="MemoryRegion"/>
<element schema="VOID"/>
<attribute name="Offset" schema="STRING" fixed="yes"/>
<attribute-alias from="_offset" to="Offset"/>
<attribute name="Object File" schema="STRING" fixed="yes"/>
<attribute-alias from="_objfile" to="Object File"/>
<attribute name="Range" schema="RANGE" required="yes"/>
<attribute-alias from="_range" to="Range"/>
<attribute name="_readable" schema="BOOL" required="yes" hidden="yes"/>
<attribute name="_writable" schema="BOOL" required="yes" hidden="yes"/>
<attribute name="_executable" schema="BOOL" required="yes" hidden="yes"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="SectionContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Section"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="Stack" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="Stack"/>
<element schema="StackFrame"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="SymbolContainer" canonical="yes" elementResync="ONCE" attributeResync="NEVER">
<element schema="Symbol"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="Symbol" elementResync="NEVER" attributeResync="NEVER">
<element schema="VOID"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="Section" elementResync="NEVER" attributeResync="NEVER">
<interface name="Section"/>
<element schema="VOID"/>
<attribute name="Range" schema="RANGE"/>
<attribute-alias from="_range" to="Range"/>
<attribute name="Offset" schema="STRING" fixed="yes"/>
<attribute-alias from="_offset" to="Offset"/>
<attribute name="Module" schema="Module" fixed="yes" hidden="yes"/>
<attribute-alias from="_module" to="Module"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="Register">
<interface name="Register"/>
<attribute schema="ANY"/>
</schema>
<schema name="AvailableContainer" canonical="yes" elementResync="ALWAYS" attributeResync="NEVER">
<element schema="Attachable"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="Attachable" elementResync="NEVER" attributeResync="NEVER">
<element schema="VOID"/>
<attribute name="PID" schema="LONG"/>
<attribute-alias from="_pid" to="PID"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="BreakpointContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="BreakpointSpec"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
<schema name="BreakpointSpec" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="BreakpointSpec"/>
<interface name="Togglable"/>
<element schema="BreakpointLocation"/>
<attribute name="Expression" schema="STRING" hidden="yes"/>
<attribute-alias from="_expression" to="Expression"/>
<attribute name="Kinds" schema="STRING" required="yes" hidden="yes"/>
<attribute-alias from="_kinds" to="Kinds"/>
<attribute name="Enabled" schema="BOOL" required="yes"/>
<attribute-alias from="_enabled" to="Enabled"/>
<attribute name="Commands" schema="STRING"/>
<attribute name="Condition" schema="STRING"/>
<attribute name="Hit Count" schema="INT"/>
<attribute name="Ignore Count" schema="INT"/>
<attribute name="Pending" schema="BOOL"/>
<attribute name="Silent" schema="BOOL"/>
<attribute name="Temporary" schema="BOOL"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="ANY"/>
</schema>
<schema name="BreakpointLocation" elementResync="NEVER" attributeResync="NEVER">
<interface name="BreakpointLocation"/>
<element schema="VOID"/>
<attribute name="Range" schema="RANGE"/>
<attribute-alias from="_range" to="Range"/>
<attribute name="_display" schema="STRING" hidden="yes"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute name="Enabled" schema="BOOL"/>
<attribute-alias from="_enabled" to="Enabled"/>
<attribute schema="ANY"/>
</schema>
<schema name="BreakpointLocationContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="BreakpointLocation"/>
<attribute name="_order" schema="INT" hidden="yes"/>
<attribute schema="VOID"/>
</schema>
</context>
@@ -11,5 +11,6 @@ src/main/py/LICENSE||GHIDRA||||END|
src/main/py/MANIFEST.in||GHIDRA||||END|
src/main/py/README.md||GHIDRA||||END|
src/main/py/pyproject.toml||GHIDRA||||END|
src/main/py/src/ghidralldb/lldb_base.xml||GHIDRA||||END|
src/main/py/src/ghidralldb/py.typed||GHIDRA||||END|
src/main/py/src/ghidralldb/schema.xml||GHIDRA||||END|
@@ -0,0 +1,35 @@
## ###
# IP: GHIDRA
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##
from merge_xml import merge
import os
import sys
rmi_path = os.getcwd() + "/../../../../../../Debugger-rmi-trace/src/main/py/src/ghidratrace/"
sys.path.append(rmi_path)
def main():
xml = rmi_path+"xml/"
merge(xml_base="lldb_base.xml",
xml_out="schema.xml",
xml_updates=[
xml+"common.xml",
xml+"available.xml",
xml+"breakpointsTiered.xml"
])
if __name__ == '__main__':
main()
@@ -0,0 +1,68 @@
<context>
<schema name="LldbSession" elementResync="NEVER" attributeResync="NEVER">
<interface name="EventScope" />
<interface name="FocusScope" />
<interface name="Aggregate" />
<element schema="VOID" />
<attribute name="Processes" schema="ProcessContainer" required="yes" fixed="yes" />
<attribute name="Available" schema="AvailableContainer" required="yes" fixed="yes" />
<attribute name="_event_thread" schema="OBJECT" hidden="yes" />
<attribute name="_focus" schema="Selectable" required="yes" hidden="yes" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Process" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Breakpoints" schema="BreakpointContainer" required="yes" fixed="yes" />
<attribute name="Watchpoints" schema="WatchpointContainer" required="yes" fixed="yes" />
</schema>
<schema name="Environment" elementResync="NEVER" attributeResync="NEVER">
<attribute name="os" schema="STRING" />
</schema>
<schema name="Thread" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Name" schema="STRING" />
</schema>
<schema name="WatchpointContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="WatchpointSpec" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="WatchpointSpec" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="BreakpointSpec" />
<interface name="BreakpointLocation" />
<interface name="Togglable" />
<attribute name="Expression" schema="STRING" required="yes" hidden="yes" />
<attribute-alias from="_expression" to="Expression" />
<attribute name="Kinds" schema="STRING" required="yes" hidden="yes" />
<attribute-alias from="_kinds" to="Kinds" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute name="Enabled" schema="BOOL" />
<attribute-alias from="_enabled" to="Enabled" />
<attribute name="Range" schema="RANGE" />
<attribute-alias from="_range" to="Range" />
<attribute name="Condition" schema="STRING" />
<attribute name="Hit Count" schema="INT" />
<attribute name="Ignore Count" schema="INT" />
<attribute schema="VOID" />
</schema>
<schema name="StackFrame" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Registers" schema="RegisterValueContainer" required="yes" fixed="yes" />
<attribute name="PC" schema="ADDRESS" required="yes" />
<attribute-alias from="_pc" to="PC" />
</schema>
<schema name="RegisterValueContainer" attributeResync="ONCE">
<attribute name="General Purpose Registers" schema="RegisterBank" />
<attribute name="Floating Point Registers" schema="RegisterBank" />
<attribute name="Advanced Vector Extensions" schema="RegisterBank" />
<attribute name="Memory Protection Extensions" schema="RegisterBank" />
<attribute name="float" schema="RegisterBank" />
<attribute name="general" schema="RegisterBank" />
<attribute name="system" schema="RegisterBank" />
<attribute schema="VOID" />
</schema>
<schema name="RegisterBank" canonical="yes" elementResync="ONCE" attributeResync="NEVER">
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="Register" />
</schema>
</context>
File diff suppressed because it is too large Load Diff
@@ -11,3 +11,4 @@ src/main/py/README.md||GHIDRA||||END|
src/main/py/pyproject.toml||GHIDRA||||END|
src/main/py/src/ghidraxdbg/py.typed||GHIDRA||||END|
src/main/py/src/ghidraxdbg/schema.xml||GHIDRA||||END|
src/main/py/src/ghidraxdbg/x64dbg_base.xml||GHIDRA||||END|
@@ -0,0 +1,38 @@
## ###
# IP: GHIDRA
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##
from merge_xml import merge
import os
import sys
rmi_path = os.getcwd() + "/../../../../../../Debugger-rmi-trace/src/main/py/src/ghidratrace/"
sys.path.append(rmi_path)
def main():
xml = rmi_path+"xml/"
merge(xml_base="x64dbg_base.xml",
xml_out="schema.xml",
xml_updates=[
xml+"sessions.xml",
xml+"common.xml",
xml+"nesting_adjustments.xml",
xml+"available.xml",
xml+"events.xml",
xml+"breakpointsFlat.xml"
])
if __name__ == '__main__':
main()
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,33 @@
<context>
<schema name="X64DbgRoot" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="EventScope" />
<attribute name="Sessions" schema="SessionContainer" required="yes" fixed="yes" />
<attribute name="Settings" schema="ANY" />
<attribute name="State" schema="State" />
<attribute-alias from="_state" to="State" />
<attribute name="Utility" schema="ANY" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY"/>
</schema>
<schema name="Process" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Debug" schema="DebugBreakpointContainer" required="yes" fixed="yes" />
<attribute name="Handle" schema="STRING" fixed="yes" />
<attribute name="Id" schema="STRING" fixed="yes" />
</schema>
<schema name="Module" elementResync="NEVER" attributeResync="NEVER">
<attribute name="ToDisplayString" schema="BOOL" hidden="yes" />
</schema>
<schema name="MemoryRegion" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Base" schema="LONG" required="yes" fixed="yes" />
</schema>
<schema name="DebugBreakpointContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Software Breakpoints" schema="BreakpointContainer" required="yes" />
<attribute name="Hardware Breakpoints" schema="BreakpointContainer" required="yes" />
<attribute name="Memory Breakpoints" schema="BreakpointContainer" required="yes" />
</schema>
<schema name="BreakpointSpec" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Name" schema="STRING" hidden="yes" />
<attribute-alias from="_name" to="Name" />
</schema>
</context>
@@ -310,3 +310,16 @@ The process parameter, if accepted, is technically redundant.
Because all address spaces among all targets must be unique, the address space encodes the process (or other target object).
If taken, the back end must validate that the address space belongs to the given process.
Otherwise, the back end must figure out the applicable target based on the space name.
# Regarding the composition of schema
Schema are now composable, i.e. the schema.xml files used by each debugger-agent may be reconstituted from smaller
fragments, typically stored in a combination of each agent's python src directory and the common store, "ghidratrace/xml",
in "Debugger-rmi-trace". The "gradle buildXmlSchema" task will build all of the schema, but individual schema may be
built by executing "python build_xml.py" from the python src directory. Each build_xml python file calls the "merge_xml"
python file in the rmi store, which uses either the powershell "merge.ps1" (Windows) or direct calls from "lxml" (Linux).
Both methods rely on XSLT to transform the base XML (typically agentname_base.xml) by adding new schema from the subpieces
or replacing attributes in common schema. There is currently no method for subtracting schema, so the entries in build_xml
must be sequential with later entries overriding earlier ones.
@@ -15,4 +15,12 @@ src/main/py/LICENSE||GHIDRA||||END|
src/main/py/README.md||GHIDRA||||END|
src/main/py/pyproject.toml||GHIDRA||||END|
src/main/py/src/ghidratrace/py.typed||GHIDRA||||END|
src/main/py/src/ghidratrace/xml/available.xml||GHIDRA||||END|
src/main/py/src/ghidratrace/xml/breakpointsFlat.xml||GHIDRA||||END|
src/main/py/src/ghidratrace/xml/breakpointsTiered.xml||GHIDRA||||END|
src/main/py/src/ghidratrace/xml/common.xml||GHIDRA||||END|
src/main/py/src/ghidratrace/xml/events.xml||GHIDRA||||END|
src/main/py/src/ghidratrace/xml/merge.xsl||GHIDRA||||END|
src/main/py/src/ghidratrace/xml/nesting_adjustments.xml||GHIDRA||||END|
src/main/py/src/ghidratrace/xml/sessions.xml||GHIDRA||||END|
src/main/py/tests/EMPTY||GHIDRA||||END|
@@ -0,0 +1,59 @@
## ###
# IP: GHIDRA
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##
param (
[string]$XmlInput,
[string]$RmiDir,
[string]$XmlOutput,
[string]$XmlUpdates
)
Write-Host "Compositing schema..."
$warning = $RmiDir+"warning.xml"
$xslFile = $RmiDir+"merge.xsl"
$xslt = New-Object System.Xml.Xsl.XslCompiledTransform
$settings = New-Object System.Xml.Xsl.XsltSettings($true, $false)
$resolver = New-Object System.Xml.XmlUrlResolver
$xslt.Load((Resolve-Path $xslFile), $settings, $resolver)
$workingFile = Join-Path $pwd "current.xml"
Copy-Item $XmlInput $workingFile -Force
$comment = "<!-- This file was autogenerated using build_xml. DO NOT EDIT.-->`r`n"
$content = Get-Content $workingFile -Raw
Set-Content $workingFile -Value ($comment + $content) -NoNewLine
foreach ($fileName in ($XmlUpdates -split " ")) {
if (Test-Path $fileName) {
$scratch = Join-Path $pwd "temp.xml"
$xsltArgs = New-Object System.Xml.Xsl.XsltArgumentList
$xsltArgs.AddParam("fileName", "", (Resolve-Path $fileName).Path)
$writer = [System.Xml.XmlWriter]::Create($scratch, $xslt.OutputSettings)
try {
$xslt.Transform((Resolve-Path $workingFile).Path, $xsltArgs, $writer)
$writer.Close()
$writer.Dispose()
Move-Item $scratch $workingFile -Force
}
catch {
$writer.Close()
Write-Error "File not found: $fileName"
}
}
}
Move-Item $workingFile $XmlOutput -Force
Write-Host "Transformation finished"
@@ -0,0 +1,64 @@
## ###
# IP: GHIDRA
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
##
import os
import inspect
from typing import Sequence
def merge(xml_base: str, xml_out: str, xml_updates: Sequence[str]) -> None:
frame = inspect.currentframe()
if frame is None:
raise AssertionError("we're cooked")
rmi = os.path.dirname(inspect.getfile(frame))
warning = "This file was autogenerated using build_xml. DO NOT EDIT."
# This appears to be necessitated by path issue, i.e. merge.xsl uses "document"
# and the Windows version of lxml doesn't do the right thing
if os.name == 'nt':
import subprocess
ps_script = rmi+'/merge.ps1'
updates = " ".join(xml_updates)
command = [
"powershell.exe",
"-ExecutionPolicy", "Bypass",
"-File", ps_script,
"-XmlInput", xml_base,
"-RmiDir", rmi,
"-XmlOutput", xml_out,
"-XmlUpdates", updates
]
try:
result = subprocess.run(command, capture_output=True, text=True)
print(result.stdout)
except subprocess.CalledProcessError as e:
print(f"Error: {e.stderror}")
else:
from lxml import etree
merge_doc = etree.parse(xml_base)
warning_node = etree.Comment(warning)
root = merge_doc.getroot()
root.insert(0, warning_node)
xslt_doc = etree.parse(rmi+'/xml/merge.xsl')
transform = etree.XSLT(xslt_doc)
for xml_update in xml_updates:
merge_doc = transform(
merge_doc, fileName=etree.XSLT.strparam(xml_update))
with open(xml_out, "wb") as f:
f.write(merge_doc)
@@ -0,0 +1,15 @@
<context>
<schema name="AvailableContainer" canonical="yes" elementResync="ALWAYS" attributeResync="NEVER">
<element schema="Attachable" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Attachable" elementResync="NEVER" attributeResync="NEVER">
<element schema="VOID" />
<attribute name="PID" schema="LONG" />
<attribute-alias from="_pid" to="PID" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
</context>
@@ -0,0 +1,31 @@
<context>
<schema name="BreakpointContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="BreakpointSpec" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="BreakpointSpec" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="BreakpointSpec" />
<interface name="BreakpointLocation" />
<interface name="Togglable" />
<element schema="VOID" />
<attribute name="Expression" schema="STRING" hidden="yes" />
<attribute-alias from="_expression" to="Expression" />
<attribute name="Kinds" schema="STRING" required="yes" hidden="yes" />
<attribute-alias from="_kinds" to="Kinds" />
<attribute name="Range" schema="RANGE" />
<attribute-alias from="_range" to="Range" />
<attribute name="Enabled" schema="BOOL" required="yes" />
<attribute-alias from="_enabled" to="Enabled" />
<attribute name="Commands" schema="STRING" />
<attribute name="Condition" schema="STRING" />
<attribute name="Hit Count" schema="INT" />
<attribute name="Ignore Count" schema="INT" />
<attribute name="Pending" schema="BOOL" />
<attribute name="Silent" schema="BOOL" />
<attribute name="Temporary" schema="BOOL" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
</context>
@@ -0,0 +1,44 @@
<context>
<schema name="BreakpointContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="BreakpointSpec" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="BreakpointSpec" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="BreakpointSpec" />
<interface name="Togglable" />
<element schema="BreakpointLocation" />
<attribute name="Expression" schema="STRING" hidden="yes" />
<attribute-alias from="_expression" to="Expression" />
<attribute name="Kinds" schema="STRING" required="yes" hidden="yes" />
<attribute-alias from="_kinds" to="Kinds" />
<attribute name="Enabled" schema="BOOL" required="yes" />
<attribute-alias from="_enabled" to="Enabled" />
<attribute name="Commands" schema="STRING" />
<attribute name="Condition" schema="STRING" />
<attribute name="Hit Count" schema="INT" />
<attribute name="Ignore Count" schema="INT" />
<attribute name="Pending" schema="BOOL" />
<attribute name="Silent" schema="BOOL" />
<attribute name="Temporary" schema="BOOL" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="BreakpointLocation" elementResync="NEVER" attributeResync="NEVER">
<interface name="BreakpointLocation" />
<element schema="VOID" />
<attribute name="Range" schema="RANGE" />
<attribute-alias from="_range" to="Range" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute name="Enabled" schema="BOOL" />
<attribute-alias from="_enabled" to="Enabled" />
<attribute schema="ANY" />
</schema>
<schema name="BreakpointLocationContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="BreakpointLocation" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
</context>
@@ -0,0 +1,167 @@
<context>
<schema name="Selectable" elementResync="NEVER" attributeResync="NEVER">
<element schema="OBJECT" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="State" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="VOID" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY"/>
</schema>
<schema name="ProcessContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Process" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Process" elementResync="NEVER" attributeResync="NEVER">
<interface name="Activatable" />
<interface name="Process" />
<interface name="Aggregate" />
<interface name="ExecutionStateful" />
<element schema="VOID" />
<attribute name="Threads" schema="ThreadContainer" required="yes" fixed="yes" />
<attribute name="Exit Code" schema="LONG" />
<attribute-alias from="_exit_code" to="Exit Code" />
<attribute name="Environment" schema="Environment" required="yes" fixed="yes" />
<attribute name="Memory" schema="Memory" required="yes" fixed="yes" />
<attribute name="Modules" schema="ModuleContainer" required="yes" fixed="yes" />
<attribute name="PID" schema="LONG" hidden="yes" />
<attribute-alias from="_pid" to="PID" />
<attribute name="State" schema="EXECUTION_STATE" required="yes" hidden="yes" />
<attribute-alias from="_state" to="State" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_short_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="Environment" elementResync="NEVER" attributeResync="NEVER">
<interface name="Environment" />
<element schema="VOID" />
<attribute name="OS" schema="STRING" />
<attribute name="Arch" schema="STRING" />
<attribute name="Endian" schema="STRING" />
<attribute name="Debugger" schema="STRING" />
<attribute-alias from="_os" to="OS" />
<attribute-alias from="_arch" to="Arch" />
<attribute-alias from="_endian" to="Endian" />
<attribute-alias from="_debugger" to="Debugger" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="ModuleContainer" canonical="yes" elementResync="ONCE" attributeResync="NEVER">
<element schema="Module" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Memory" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="Memory" />
<element schema="MemoryRegion" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="ThreadContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Thread" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Thread" elementResync="NEVER" attributeResync="NEVER">
<interface name="Activatable" />
<interface name="Thread" />
<interface name="ExecutionStateful" />
<interface name="Aggregate" />
<element schema="VOID" />
<attribute name="Stack" schema="Stack" required="yes" fixed="yes" />
<attribute name="TID" schema="LONG" />
<attribute-alias from="_tid" to="TID" />
<attribute name="State" schema="EXECUTION_STATE" required="yes" hidden="yes" />
<attribute-alias from="_state" to="State" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_short_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="Module" elementResync="NEVER" attributeResync="NEVER">
<interface name="Module" />
<element schema="VOID" />
<attribute name="Sections" schema="SectionContainer" required="yes" fixed="yes" />
<attribute name="Symbols" schema="SymbolContainer" required="yes" fixed="yes" />
<attribute name="Name" schema="STRING" />
<attribute-alias from="_module_name" to="Name" />
<attribute name="Range" schema="RANGE" />
<attribute-alias from="_range" to="Range" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="MemoryRegion" elementResync="NEVER" attributeResync="NEVER">
<interface name="MemoryRegion" />
<element schema="VOID" />
<attribute name="Offset" schema="STRING" fixed="yes" />
<attribute-alias from="_offset" to="Offset" />
<attribute name="Object File" schema="STRING" fixed="yes" />
<attribute-alias from="_objfile" to="Object File" />
<attribute name="Range" schema="RANGE" required="yes" />
<attribute-alias from="_range" to="Range" />
<attribute name="_readable" schema="BOOL" required="yes" hidden="yes" />
<attribute name="_writable" schema="BOOL" required="yes" hidden="yes" />
<attribute name="_executable" schema="BOOL" required="yes" hidden="yes" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="SectionContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Section" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Stack" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="Stack" />
<element schema="StackFrame" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="SymbolContainer" canonical="yes" elementResync="ONCE" attributeResync="NEVER">
<element schema="Symbol" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Symbol" elementResync="NEVER" attributeResync="NEVER">
<element schema="VOID" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="StackFrame" elementResync="NEVER" attributeResync="NEVER">
<interface name="Activatable" />
<interface name="StackFrame" />
<interface name="Aggregate" />
<element schema="VOID" />
<attribute name="Function" schema="STRING" hidden="yes" />
<attribute-alias from="_function" to="Function" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="Section" elementResync="NEVER" attributeResync="NEVER">
<interface name="Section" />
<element schema="VOID" />
<attribute name="Range" schema="RANGE" />
<attribute-alias from="_range" to="Range" />
<attribute name="Offset" schema="STRING" fixed="yes" />
<attribute-alias from="_offset" to="Offset" />
<attribute name="Module" schema="Module" fixed="yes" hidden = "yes" />
<attribute-alias from="_module" to="Module" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="RegisterValueContainer" canonical="yes" attributeResync="ONCE">
<interface name="RegisterContainer" />
<attribute name="_order" schema="INT" hidden="yes" />
</schema>
<schema name="Register">
<interface name="Register" />
<attribute schema="ANY" />
</schema>
</context>
@@ -0,0 +1,46 @@
<context>
<schema name="DebugBreakpointContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="Aggregate" />
<element schema="VOID" />
<attribute name="Events" schema="EventContainer" required="yes" />
<attribute name="Exceptions" schema="ExceptionContainer" required="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="EventContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Event" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Event" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="ANY" />
<attribute name="Cont" schema="ContinueOption" />
<attribute name="Exec" schema="ExecutionOption" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="ExceptionContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Exception" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="Exception" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="ANY" />
<attribute name="Cont" schema="ContinueOption" />
<attribute name="Exec" schema="ExecutionOption" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="ContinueOption" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="Togglable" />
<element schema="VOID" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
<schema name="ExecutionOption" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="Togglable" />
<element schema="VOID" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY" />
</schema>
</context>
@@ -0,0 +1,93 @@
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="fileName" />
<xsl:variable name="updates" select="document($fileName)" />
<xsl:template match="@* | node()">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
</xsl:copy>
</xsl:template>
<!-- 1. Schema Level: Merging Children -->
<xsl:template match="schema">
<xsl:variable name="schemaName" select="@name"/>
<xsl:variable name="updateSchema" select="$updates/context/schema[@name = $schemaName]"/>
<xsl:copy>
<xsl:apply-templates select="@*"/>
<!-- Process File 1 children -->
<xsl:apply-templates select="node()"/>
<!-- Add children from File 2 that are completely missing in File 1 -->
<xsl:if test="$updateSchema">
<xsl:variable name="file1Children" select="*"/>
<xsl:for-each select="$updateSchema/*">
<xsl:choose>
<!-- For nodes with names -->
<xsl:when test="@name and not($file1Children[@name = current()/@name])">
<xsl:copy-of select="."/>
</xsl:when>
<!-- For nodes without names (e.g. VOID) match by schema -->
<xsl:when test="not(@name) and @schema and not($file1Children[not(@name) and @schema = current()/@schema])">
<xsl:copy-of select="."/>
</xsl:when>
<!-- For nodes without names (e.g. VOID) match by 'from' -->
<xsl:when test="not(@name) and @from and not($file1Children[not(@name) and @from = current()/@from])">
<xsl:copy-of select="."/>
</xsl:when>
</xsl:choose>
</xsl:for-each>
</xsl:if>
</xsl:copy>
</xsl:template>
<!-- 2. Overwrite Rule for attributes WITH a name -->
<xsl:template match="schema/*[@name]">
<xsl:variable name="schemaName" select="../@name"/>
<xsl:variable name="childName" select="@name"/>
<xsl:variable name="updateNode" select="$updates/context/schema[@name = $schemaName]/*[@name = $childName]"/>
<xsl:choose>
<xsl:when test="$updateNode">
<xsl:copy-of select="$updateNode"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- 3. Overwrite Rule for attributes WITHOUT a name (VOID, ANY) -->
<xsl:template match="schema/*[not(@name) and @schema]">
<xsl:variable name="schemaName" select="../@name"/>
<xsl:variable name="schemaType" select="@schema"/>
<xsl:variable name="updateNode" select="$updates/context/schema[@name = $schemaName]/*[not(@name) and @schema = $schemaType]"/>
<xsl:choose>
<xsl:when test="$updateNode">
<xsl:copy-of select="$updateNode"/>
</xsl:when>
<xsl:otherwise>
<xsl:copy><xsl:apply-templates select="@* | node()"/></xsl:copy>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- 4. Add completely new schemas -->
<xsl:template match="/*">
<xsl:copy>
<xsl:apply-templates select="@* | node()"/>
<xsl:variable name="file1Root" select="."/>
<xsl:for-each select="$updates/context/schema">
<xsl:if test="not($file1Root/schema[@name = current()/@name])">
<xsl:copy-of select="."/>
</xsl:if>
</xsl:for-each>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
@@ -0,0 +1,47 @@
<!-- These are adjustment common to the Windows agents -->
<context>
<schema name="Thread" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Stack" schema="StackFramesContainer" required="yes" fixed="yes" />
<attribute name="Registers" schema="RegisterValueContainer" required="yes" fixed="yes" />
<attribute name="Environment" schema="ANY" fixed="yes" />
<attribute name="Id" schema="STRING" fixed="yes" />
<attribute name="Advance" schema="Method" required="yes" fixed="yes" hidden="yes" />
</schema>
<schema name="Method" elementResync="NEVER" attributeResync="NEVER">
<interface name="Method" />
<element schema="VOID" />
<attribute name="_display" schema="STRING" required="yes" fixed="yes" hidden="yes" />
<attribute name="_return_type" schema="TYPE" required="yes" fixed="yes" hidden="yes" />
<attribute name="_parameters" schema="MAP_PARAMETERS" required="yes" fixed="yes" hidden="yes" />
<attribute schema="VOID" fixed="yes" hidden="yes" />
</schema>
<schema name="StackFramesContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<interface name="Aggregate" />
<element schema="VOID" />
<attribute name="Frames" schema="Stack" required="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="VOID" />
</schema>
<schema name="StackFrame" elementResync="NEVER" attributeResync="NEVER">
<attribute name="Instruction Offset" schema="ADDRESS" required="yes" />
<attribute-alias from="_pc" to="Instruction Offset" />
<attribute name="Stack Offset" schema="ADDRESS" />
<attribute name="Return Offset" schema="ADDRESS" />
<attribute name="Frame Offset" schema="ADDRESS" />
<attribute schema="ANY" />
</schema>
<schema name="RegisterValueContainer" attributeResync="ONCE">
<attribute name="General Purpose Registers" schema="RegisterBank" />
<attribute name="Floating Point Registers" schema="RegisterBank" />
<attribute name="Advanced Vector Extensions" schema="RegisterBank" />
<attribute name="Memory Protection Extensions" schema="RegisterBank" />
<attribute name="FloatingPoint" schema="RegisterBank" />
<attribute name="SIMD" schema="RegisterBank" />
<attribute name="User" schema="RegisterBank" />
<attribute schema="VOID" />
</schema>
<schema name="RegisterBank" canonical="yes" elementResync="ONCE" attributeResync="NEVER">
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="Register" />
</schema>
</context>
@@ -0,0 +1,21 @@
<context>
<schema name="SessionContainer" canonical="yes" elementResync="NEVER" attributeResync="NEVER">
<element schema="Session" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY"/>
</schema>
<schema name="Session" elementResync="NEVER" attributeResync="NEVER">
<interface name="Activatable" />
<interface name="FocusScope" />
<interface name="Aggregate" />
<interface name="ExecutionStateful" />
<element schema="VOID" />
<attribute name="Processes" schema="ProcessContainer" required="yes" fixed="yes" />
<attribute name="Available" schema="AvailableContainer" required="yes" fixed="yes" />
<attribute name="_event_thread" schema="OBJECT" hidden="yes" />
<attribute name="_focus" schema="Selectable" required="yes" hidden="yes" />
<attribute name="_display" schema="STRING" hidden="yes" />
<attribute name="_order" schema="INT" hidden="yes" />
<attribute schema="ANY"/>
</schema>
</context>
+31
View File
@@ -124,3 +124,34 @@ ext.distributePyDep = { name ->
}
}
}
// This task composes debugger schema files from their subpieces
def foundFiles = fileTree("src/main/py/src").matching {
include "**/build_xml.py"
}
task buildXmlSchema {
doLast {
if (rootProject.PYTHON3 == null) {
throw new GradleException("A supported version of Python [${PYTHON_SUPPORTED}] was not found!")
}
File buildScript = foundFiles.isEmpty() ? null : foundFiles.singleFile
if (buildScript == null || !buildScript.exists()) {
println "Warning: Could not find build_xml.py for ${project.name}"
return
}
def exec = providers.exec {
workingDir { buildScript.parentFile }
ignoreExitValue = true
commandLine rootProject.PYTHON3
args "build_xml.py"
}
if (exec.result.get().exitValue != 0) {
throw new GradleException(exec.standardError.asText.get().strip())
}
}
}