diff --git a/_fixtures/nodisasm/main.go b/_fixtures/nodisasm/main.go new file mode 100644 index 00000000..fe8d6420 --- /dev/null +++ b/_fixtures/nodisasm/main.go @@ -0,0 +1,7 @@ +package main + +func asmFunc() + +func main() { + asmFunc() +} diff --git a/_fixtures/nodisasm/nodisasm_amd64.s b/_fixtures/nodisasm/nodisasm_amd64.s new file mode 100644 index 00000000..67a0fdee --- /dev/null +++ b/_fixtures/nodisasm/nodisasm_amd64.s @@ -0,0 +1,16 @@ +#include "textflag.h" + +TEXT ·asmFunc(SB),0,$0-0 + MOVQ AX, AX + MOVQ AX, AX + MOVQ AX, AX + MOVSS (AX), X2 + VBROADCASTSS X2, X2 + VMOVDQU (AX), X3 + MOVSS (AX), X1 + PUNPCKLBW X0, X1 + VPUNPCKLWD X0, X1, X1 + MOVQ AX, AX + MOVQ AX, AX + MOVQ AX, AX + RET diff --git a/pkg/proc/disasm_amd64.go b/pkg/proc/disasm_amd64.go index 3bb4616f..2b3bd10c 100644 --- a/pkg/proc/disasm_amd64.go +++ b/pkg/proc/disasm_amd64.go @@ -56,6 +56,9 @@ func (inst *AsmInstruction) Text(flavour AssemblyFlavour, bi *BinaryInfo) string } func (inst *AsmInstruction) IsCall() bool { + if inst.Inst == nil { + return false + } return inst.Inst.Op == x86asm.CALL || inst.Inst.Op == x86asm.LCALL } diff --git a/pkg/proc/proc_test.go b/pkg/proc/proc_test.go index 5e2e591c..d66d6f01 100644 --- a/pkg/proc/proc_test.go +++ b/pkg/proc/proc_test.go @@ -3996,3 +3996,15 @@ func TestReadDefer(t *testing.T) { } }) } + +func TestNextUnknownInstr(t *testing.T) { + if !goversion.VersionAfterOrEqual(runtime.Version(), 1, 10) { + t.Skip("versions of Go before 1.10 can't assemble the instruction VPUNPCKLWD") + } + withTestProcess("nodisasm/", t, func(p proc.Process, fixture protest.Fixture) { + _, err := setFunctionBreakpoint(p, "main.asmFunc") + assertNoError(err, t, "setFunctionBreakpoint()") + assertNoError(proc.Continue(p), t, "Continue()") + assertNoError(proc.Next(p), t, "Next()") + }) +}