mirror of
https://github.com/beego/bee.git
synced 2024-11-24 23:30:55 +00:00
68 lines
1.8 KiB
Go
68 lines
1.8 KiB
Go
package proc
|
|
|
|
type AsmInstruction struct {
|
|
Loc Location
|
|
DestLoc *Location
|
|
Bytes []byte
|
|
Breakpoint bool
|
|
AtPC bool
|
|
Inst *ArchInst
|
|
}
|
|
|
|
type AssemblyFlavour int
|
|
|
|
const (
|
|
GNUFlavour = AssemblyFlavour(iota)
|
|
IntelFlavour
|
|
)
|
|
|
|
// Disassemble disassembles target memory between startPC and endPC
|
|
// If currentGoroutine is set and thread is stopped at a CALL instruction Disassemble will evaluate the argument of the CALL instruction using the thread's registers
|
|
// Be aware that the Bytes field of each returned instruction is a slice of a larger array of size endPC - startPC
|
|
func (thread *Thread) Disassemble(startPC, endPC uint64, currentGoroutine bool) ([]AsmInstruction, error) {
|
|
if thread.dbp.exited {
|
|
return nil, &ProcessExitedError{}
|
|
}
|
|
mem, err := thread.readMemory(uintptr(startPC), int(endPC-startPC))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
r := make([]AsmInstruction, 0, len(mem)/15)
|
|
pc := startPC
|
|
|
|
var curpc uint64
|
|
var regs Registers
|
|
if currentGoroutine {
|
|
regs, _ = thread.Registers(false)
|
|
if regs != nil {
|
|
curpc = regs.PC()
|
|
}
|
|
}
|
|
|
|
for len(mem) > 0 {
|
|
bp, atbp := thread.dbp.Breakpoints[pc]
|
|
if atbp {
|
|
for i := range bp.OriginalData {
|
|
mem[i] = bp.OriginalData[i]
|
|
}
|
|
}
|
|
file, line, fn := thread.dbp.PCToLine(pc)
|
|
loc := Location{PC: pc, File: file, Line: line, Fn: fn}
|
|
inst, err := asmDecode(mem, pc)
|
|
if err == nil {
|
|
atpc := currentGoroutine && (curpc == pc)
|
|
destloc := thread.resolveCallArg(inst, atpc, regs)
|
|
r = append(r, AsmInstruction{Loc: loc, DestLoc: destloc, Bytes: mem[:inst.Len], Breakpoint: atbp, AtPC: atpc, Inst: inst})
|
|
|
|
pc += uint64(inst.Size())
|
|
mem = mem[inst.Size():]
|
|
} else {
|
|
r = append(r, AsmInstruction{Loc: loc, Bytes: mem[:1], Breakpoint: atbp, Inst: nil})
|
|
pc++
|
|
mem = mem[1:]
|
|
}
|
|
}
|
|
return r, nil
|
|
}
|