diff --git a/Documentation/components/tools/index.rst b/Documentation/components/tools/index.rst index 65ccb8e0545..78874e45560 100644 --- a/Documentation/components/tools/index.rst +++ b/Documentation/components/tools/index.rst @@ -7,6 +7,11 @@ This page discusses the contents of the NuttX tools/ directory. The tools/ directory contains miscellaneous scripts and host C programs that are necessary parts of the NuttX build system. +.. toctree:: + :maxdepth: 2 + + parsetrace + cmpconfig.c ----------- @@ -1225,6 +1230,11 @@ Binaries for both Windows and Linux are available at: See also indent.sh and nxstyle.c +parsetrace.py +------------- + +``parsetrace.py`` is a Python script for parsing and converting NuttX trace logs. See :doc:`parsetrace` for details. + zds --- diff --git a/Documentation/components/tools/parsetrace.rst b/Documentation/components/tools/parsetrace.rst new file mode 100644 index 00000000000..e8d71e18d6d --- /dev/null +++ b/Documentation/components/tools/parsetrace.rst @@ -0,0 +1,75 @@ +parsetrace.py +============= + +`parsetrace.py` is a trace log parsing tool for the NuttX RTOS. It supports converting binary or text trace logs into a human-readable systrace format, and can resolve symbols and type information from ELF files. The tool also supports real-time trace data parsing via serial port. + +Features +-------- +- Supports parsing both binary and text trace log formats. +- Integrates with ELF files to resolve symbols and type information for improved log readability. +- Supports real-time trace data parsing from a serial device. +- Outputs systrace-compatible format for performance analysis and debugging. + +Dependencies +------------ +- Python 3 +- pyelftools +- cxxfilt +- pydantic +- parse +- pycstruct +- colorlog +- serial + +Install dependencies: + +.. code-block:: bash + + pip install pyelftools cxxfilt pydantic parse pycstruct colorlog serial + +Usage +----- + +.. code-block:: bash + + python3 tools/parsetrace.py -t -e [-o ] [-v] + +Arguments: + +- ``-t, --trace``: Path to the original trace file (supports binary or text format) +- ``-e, --elf``: Path to the NuttX ELF file (for symbol resolution) +- ``-o, --output``: Output file path, default is ``trace.systrace`` +- ``-v, --verbose``: Enable verbose output +- ``-d, --device``: Serial device name (for real-time trace parsing) +- ``-b, --baudrate``: Serial baud rate, default is 115200 + +Examples +-------- + +Parse a text trace log and output as systrace format: + +.. code-block:: bash + + python3 tools/parsetrace.py -t trace.log -e nuttx.elf -o trace.systrace + +Parse a binary trace log: + +.. code-block:: bash + + python3 tools/parsetrace.py -t trace.bin -e nuttx.elf + +Parse trace data from a serial device in real time: + +.. code-block:: bash + + python3 tools/parsetrace.py -d /dev/ttyUSB0 -e nuttx.elf + +Main Classes and Functions +-------------------------- + +- ``SymbolTables``: Handles ELF symbol and type information parsing. +- ``Trace``: Parses text trace logs. +- ``ParseBinaryLogTool``: Parses binary trace logs. +- ``TraceDecoder``: Parses real-time trace data from serial port. + +For more details, refer to the source code in ``tools/parsetrace.py``. diff --git a/tools/parsetrace.py b/tools/parsetrace.py index 205969fa095..351f6101d0b 100755 --- a/tools/parsetrace.py +++ b/tools/parsetrace.py @@ -133,9 +133,14 @@ class SymbolTables(object): if name == type_name: if "DW_AT_type" in DIE.attributes: type_attr = DIE.attributes["DW_AT_type"] - base_type_die = dwarfinfo.get_DIE_from_refaddr( - type_attr.value + CU.cu_offset - ) + if type_attr.form == "DW_FORM_ref_addr": + base_type_die = dwarfinfo.get_DIE_from_refaddr( + type_attr.value + ) + else: + base_type_die = dwarfinfo.get_DIE_from_refaddr( + type_attr.value + CU.cu_offset + ) if base_type_die.tag == "DW_TAG_base_type": size = base_type_die.attributes["DW_AT_byte_size"].value elif base_type_die.tag == "DW_TAG_typedef":