emdbg.debug.px4.buffer
1# Copyright (c) 2023, Auterion AG 2# SPDX-License-Identifier: BSD-3-Clause 3 4from __future__ import annotations 5from .base import Base 6from .utils import gdb_len 7 8 9class UartBuffer(Base): 10 """ 11 Pretty Printing UART buffers 12 """ 13 14 def __init__(self, gdb, buf_ptr: "gdb.Value"): 15 super().__init__(gdb) 16 self._buf = buf_ptr 17 18 def children(self) -> Iterator[tuple[str, Any]]: 19 size, head, tail = self._buf['size'], self._buf['head'], self._buf['tail'] 20 used = head - tail if (tail <= head) else size - tail + head 21 free = size - used 22 yield ("sem", self._buf['sem']) 23 yield ("size", size) 24 yield ("buffer", self._buf['buffer']) 25 yield ("tail -> head", f"{tail} -> {head}: {used} used, {free} free") 26 if used: 27 ptr = int(self._buf['buffer'].address) 28 if (tail < head): 29 # [tail, head] 30 memories = [self.read_memory(ptr + tail, used)] 31 else: 32 # head], [tail 33 memories = [self.read_memory(ptr + tail, size - tail), 34 self.read_memory(ptr, head)] 35 # Convert to Prints else \hh hex values 36 content = "".join(chr(v) if chr(v).isprintable() else f"\\{v:02x}" 37 for memory in memories 38 for v in memory.tobytes()) 39 yield ("content", content) 40 41 42class ConsoleBuffer(Base): 43 """ 44 Pretty Printing Console buffers 45 """ 46 def __init__(self, gdb, buf_ptr: "gdb.Value"): 47 super().__init__(gdb) 48 self._buf = buf_ptr 49 50 def to_string(self) -> str: 51 ptr = int(self._buf['_buffer'].address) 52 size = gdb_len(self._buf['_buffer']) 53 head, tail = self._buf['_tail'], self._buf['_head'] 54 used = head - tail if (tail <= head) else size - tail + head 55 header = f"ConsoleBuffer({used}B/{size}B: " 56 if tail <= head: header += f"[{tail} -> {head}]) =\n" 57 else: header += f"{head}] <- [{tail}) =\n" 58 if used: 59 if (tail <= head): 60 # [tail, head] 61 memories = [self.read_memory(ptr + tail, used)] 62 else: 63 # head], [tail 64 memories = [self.read_memory(ptr + tail, size - tail), 65 self.read_memory(ptr, head)] 66 header += "".join(chr(v) 67 for memory in memories 68 for v in memory.tobytes()) 69 return header
10class UartBuffer(Base): 11 """ 12 Pretty Printing UART buffers 13 """ 14 15 def __init__(self, gdb, buf_ptr: "gdb.Value"): 16 super().__init__(gdb) 17 self._buf = buf_ptr 18 19 def children(self) -> Iterator[tuple[str, Any]]: 20 size, head, tail = self._buf['size'], self._buf['head'], self._buf['tail'] 21 used = head - tail if (tail <= head) else size - tail + head 22 free = size - used 23 yield ("sem", self._buf['sem']) 24 yield ("size", size) 25 yield ("buffer", self._buf['buffer']) 26 yield ("tail -> head", f"{tail} -> {head}: {used} used, {free} free") 27 if used: 28 ptr = int(self._buf['buffer'].address) 29 if (tail < head): 30 # [tail, head] 31 memories = [self.read_memory(ptr + tail, used)] 32 else: 33 # head], [tail 34 memories = [self.read_memory(ptr + tail, size - tail), 35 self.read_memory(ptr, head)] 36 # Convert to Prints else \hh hex values 37 content = "".join(chr(v) if chr(v).isprintable() else f"\\{v:02x}" 38 for memory in memories 39 for v in memory.tobytes()) 40 yield ("content", content)
Pretty Printing UART buffers
def
children(self) -> 'Iterator[tuple[str, Any]]':
19 def children(self) -> Iterator[tuple[str, Any]]: 20 size, head, tail = self._buf['size'], self._buf['head'], self._buf['tail'] 21 used = head - tail if (tail <= head) else size - tail + head 22 free = size - used 23 yield ("sem", self._buf['sem']) 24 yield ("size", size) 25 yield ("buffer", self._buf['buffer']) 26 yield ("tail -> head", f"{tail} -> {head}: {used} used, {free} free") 27 if used: 28 ptr = int(self._buf['buffer'].address) 29 if (tail < head): 30 # [tail, head] 31 memories = [self.read_memory(ptr + tail, used)] 32 else: 33 # head], [tail 34 memories = [self.read_memory(ptr + tail, size - tail), 35 self.read_memory(ptr, head)] 36 # Convert to Prints else \hh hex values 37 content = "".join(chr(v) if chr(v).isprintable() else f"\\{v:02x}" 38 for memory in memories 39 for v in memory.tobytes()) 40 yield ("content", content)
Inherited Members
- emdbg.debug.px4.base.Base
- register_names
- registers
- read_register
- write_register
- write_registers
- fix_nuttx_sp
- lookup_static_symbol_in_function
- lookup_static_symbol_ptr
- lookup_global_symbol_ptr
- lookup_static_symbol_in_function_ptr
- value_ptr
- addr_ptr
- read_memory
- write_memory
- read_uint
- read_int
- read_string
- symtab_line
- block
- description_at
- integer_type
- uint32
- int32
43class ConsoleBuffer(Base): 44 """ 45 Pretty Printing Console buffers 46 """ 47 def __init__(self, gdb, buf_ptr: "gdb.Value"): 48 super().__init__(gdb) 49 self._buf = buf_ptr 50 51 def to_string(self) -> str: 52 ptr = int(self._buf['_buffer'].address) 53 size = gdb_len(self._buf['_buffer']) 54 head, tail = self._buf['_tail'], self._buf['_head'] 55 used = head - tail if (tail <= head) else size - tail + head 56 header = f"ConsoleBuffer({used}B/{size}B: " 57 if tail <= head: header += f"[{tail} -> {head}]) =\n" 58 else: header += f"{head}] <- [{tail}) =\n" 59 if used: 60 if (tail <= head): 61 # [tail, head] 62 memories = [self.read_memory(ptr + tail, used)] 63 else: 64 # head], [tail 65 memories = [self.read_memory(ptr + tail, size - tail), 66 self.read_memory(ptr, head)] 67 header += "".join(chr(v) 68 for memory in memories 69 for v in memory.tobytes()) 70 return header
Pretty Printing Console buffers
def
to_string(self) -> str:
51 def to_string(self) -> str: 52 ptr = int(self._buf['_buffer'].address) 53 size = gdb_len(self._buf['_buffer']) 54 head, tail = self._buf['_tail'], self._buf['_head'] 55 used = head - tail if (tail <= head) else size - tail + head 56 header = f"ConsoleBuffer({used}B/{size}B: " 57 if tail <= head: header += f"[{tail} -> {head}]) =\n" 58 else: header += f"{head}] <- [{tail}) =\n" 59 if used: 60 if (tail <= head): 61 # [tail, head] 62 memories = [self.read_memory(ptr + tail, used)] 63 else: 64 # head], [tail 65 memories = [self.read_memory(ptr + tail, size - tail), 66 self.read_memory(ptr, head)] 67 header += "".join(chr(v) 68 for memory in memories 69 for v in memory.tobytes()) 70 return header
Inherited Members
- emdbg.debug.px4.base.Base
- register_names
- registers
- read_register
- write_register
- write_registers
- fix_nuttx_sp
- lookup_static_symbol_in_function
- lookup_static_symbol_ptr
- lookup_global_symbol_ptr
- lookup_static_symbol_in_function_ptr
- value_ptr
- addr_ptr
- read_memory
- write_memory
- read_uint
- read_int
- read_string
- symtab_line
- block
- description_at
- integer_type
- uint32
- int32