2026-08-03 19:42:05 +02:00
|
|
|
// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
|
|
|
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
|
|
2026-08-21 00:50:31 +02:00
|
|
|
//go:build linux
|
|
|
|
|
|
2026-08-03 19:42:05 +02:00
|
|
|
package debug
|
|
|
|
|
|
|
|
|
|
// tracer abstracts the minimal ptrace operations needed by the breakpoint
|
|
|
|
|
// manager and the stop-information helpers. The live implementation is
|
|
|
|
|
// *Session (ptrace_linux_amd64.go); tests supply a mock.
|
|
|
|
|
type tracer interface {
|
|
|
|
|
Peek(addr uint64) (uint64, error)
|
|
|
|
|
Poke(addr uint64, val uint64) error
|
|
|
|
|
SetRegs(regs *Regs) error
|
2026-09-19 23:49:19 +02:00
|
|
|
Step() error
|
2026-08-03 19:42:05 +02:00
|
|
|
Pid() int
|
|
|
|
|
}
|
|
|
|
|
|
2026-09-19 23:49:19 +02:00
|
|
|
// mockTracer records Peek/Poke/Step calls and provides fake register state.
|
2026-08-03 19:42:05 +02:00
|
|
|
type mockTracer struct {
|
|
|
|
|
mem map[uint64]byte
|
|
|
|
|
peeks []uint64
|
|
|
|
|
pokes []struct {
|
|
|
|
|
addr uint64
|
|
|
|
|
val uint64
|
|
|
|
|
}
|
2026-09-19 23:49:19 +02:00
|
|
|
steps int
|
|
|
|
|
regs *Regs
|
2026-08-03 19:42:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func newMockTracer() *mockTracer {
|
|
|
|
|
return &mockTracer{
|
|
|
|
|
mem: make(map[uint64]byte),
|
|
|
|
|
regs: &Regs{},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (m *mockTracer) Peek(addr uint64) (uint64, error) {
|
|
|
|
|
m.peeks = append(m.peeks, addr)
|
|
|
|
|
var val uint64
|
2026-08-29 15:40:31 +02:00
|
|
|
for i := range uint64(8) {
|
2026-08-03 19:42:05 +02:00
|
|
|
val |= uint64(m.mem[addr+i]) << (i * 8)
|
|
|
|
|
}
|
|
|
|
|
return val, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (m *mockTracer) Poke(addr uint64, val uint64) error {
|
|
|
|
|
m.pokes = append(m.pokes, struct {
|
|
|
|
|
addr uint64
|
|
|
|
|
val uint64
|
|
|
|
|
}{addr, val})
|
2026-08-29 15:40:31 +02:00
|
|
|
for i := range uint64(8) {
|
2026-08-03 19:42:05 +02:00
|
|
|
m.mem[addr+i] = byte(val >> (i * 8))
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (m *mockTracer) SetRegs(regs *Regs) error {
|
|
|
|
|
m.regs = regs
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2026-09-19 23:49:19 +02:00
|
|
|
func (m *mockTracer) Step() error {
|
|
|
|
|
m.steps++
|
|
|
|
|
return nil
|
|
|
|
|
}
|
2026-08-03 19:42:05 +02:00
|
|
|
func (m *mockTracer) Pid() int { return 42 }
|