// Copyright (c) 2026 Petr BalvĂ­n (https://petrbalvin.org) // SPDX-License-Identifier: BSD-3-Clause //go:build linux && arm64 package debug import ( "fmt" "golang.org/x/arch/arm64/arm64asm" ) // Disassemble decodes the instruction at the given address in the debuggee's // memory and returns its text representation and length in bytes. func (s *Session) Disassemble(addr uint64) (string, int, error) { mem, err := s.ReadMemory(addr, 4) if err != nil { return "", 0, err } inst, err := arm64asm.Decode(mem) if err != nil { return "???", 4, nil } text := arm64asm.GoSyntax(inst, addr, nil, nil) return text, 4, nil } // DisassembleN decodes up to n instructions starting at addr. func (s *Session) DisassembleN(addr uint64, n int) string { var result string pc := addr for i := 0; i < n; i++ { text, length, err := s.Disassemble(pc) if err != nil { result += fmt.Sprintf(" %#08x: \n", pc, err) break } result += fmt.Sprintf(" %#08x: %s\n", pc, text) if length == 0 { length = 4 } pc += uint64(length) } return result }