diff --git a/_fixtures/testvariables.go b/_fixtures/testvariables.go index 7ca4f8adeeca42c063abf2e1d662b8c8b87e1f35..c310e1675f174ac9a12bea8e0d71695d77482378 100644 --- a/_fixtures/testvariables.go +++ b/_fixtures/testvariables.go @@ -9,16 +9,18 @@ type FooBar struct { func foobar(baz string) { var ( - a1 = "foo" - a2 = 6 - a3 = 7.23 - a4 = [2]int{1, 2} - a5 = []int{1, 2, 3, 4, 5} - a6 = FooBar{Baz: 8, Bur: "word"} - a7 = &FooBar{Baz: 5, Bur: "strum"} + a1 = "foo" + a2 = 6 + a3 = 7.23 + a4 = [2]int{1, 2} + a5 = []int{1, 2, 3, 4, 5} + a6 = FooBar{Baz: 8, Bur: "word"} + a7 = &FooBar{Baz: 5, Bur: "strum"} + neg = -1 + i8 = int8(1) ) - fmt.Println(a1, a2, a3, a4, a5, a6, a7, baz) + fmt.Println(a1, a2, a3, a4, a5, a6, a7, baz, neg, i8) } func main() { diff --git a/proctl/variables_linux_amd64.go b/proctl/variables_linux_amd64.go index c72888925d233690c965c497fd4555d7fa49a232..2ef91b3489c00f8de581db653b28325893f1ddd3 100644 --- a/proctl/variables_linux_amd64.go +++ b/proctl/variables_linux_amd64.go @@ -139,7 +139,7 @@ func (thread *ThreadContext) extractValue(instructions []byte, off int64, typ in case *dwarf.ArrayType: return thread.readIntArray(offaddr, t) case *dwarf.IntType: - return thread.readInt(offaddr) + return thread.readInt(offaddr, t.ByteSize) case *dwarf.FloatType: return thread.readFloat64(offaddr) } @@ -225,15 +225,26 @@ func (thread *ThreadContext) readIntArray(addr uintptr, t *dwarf.ArrayType) (str return str, nil } -func (thread *ThreadContext) readInt(addr uintptr) (string, error) { - val, err := thread.readMemory(addr, 8) +func (thread *ThreadContext) readInt(addr uintptr, size int64) (string, error) { + var n int + + val, err := thread.readMemory(addr, uintptr(size)) if err != nil { return "", err } - n := binary.LittleEndian.Uint64(val) + switch size { + case 1: + n = int(val[0]) + case 2: + n = int(binary.LittleEndian.Uint16(val)) + case 4: + n = int(binary.LittleEndian.Uint32(val)) + case 8: + n = int(binary.LittleEndian.Uint64(val)) + } - return strconv.Itoa(int(n)), nil + return strconv.Itoa(n), nil } func (thread *ThreadContext) readFloat64(addr uintptr) (string, error) { diff --git a/proctl/variables_test.go b/proctl/variables_test.go index 2abce344345462b4c56defda6496c366846375a3..e165bafeaa46f2b227c7b060248d1434cb2f0918 100644 --- a/proctl/variables_test.go +++ b/proctl/variables_test.go @@ -29,10 +29,12 @@ func TestVariableEvaluation(t *testing.T) { {"a6", "main.FooBar {Baz: 8, Bur: word}", "main.FooBar"}, {"a7", "*main.FooBar {Baz: 5, Bur: strum}", "*main.FooBar"}, {"baz", "bazburzum", "struct string"}, + {"neg", "-1", "int"}, + {"i8", "1", "int8"}, } helper.WithTestProcess(executablePath, t, func(p *proctl.DebuggedProcess) { - pc, _, _ := p.GoSymTable.LineToPC(fp, 21) + pc, _, _ := p.GoSymTable.LineToPC(fp, 23) _, err := p.Break(uintptr(pc)) assertNoError(err, t, "Break() returned an error")