提交 a3700a44 编写于 作者: D Derek Parker

Improve support for int variable evaluation

上级 08aec0d5
...@@ -9,16 +9,18 @@ type FooBar struct { ...@@ -9,16 +9,18 @@ type FooBar struct {
func foobar(baz string) { func foobar(baz string) {
var ( var (
a1 = "foo" a1 = "foo"
a2 = 6 a2 = 6
a3 = 7.23 a3 = 7.23
a4 = [2]int{1, 2} a4 = [2]int{1, 2}
a5 = []int{1, 2, 3, 4, 5} a5 = []int{1, 2, 3, 4, 5}
a6 = FooBar{Baz: 8, Bur: "word"} a6 = FooBar{Baz: 8, Bur: "word"}
a7 = &FooBar{Baz: 5, Bur: "strum"} 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() { func main() {
......
...@@ -139,7 +139,7 @@ func (thread *ThreadContext) extractValue(instructions []byte, off int64, typ in ...@@ -139,7 +139,7 @@ func (thread *ThreadContext) extractValue(instructions []byte, off int64, typ in
case *dwarf.ArrayType: case *dwarf.ArrayType:
return thread.readIntArray(offaddr, t) return thread.readIntArray(offaddr, t)
case *dwarf.IntType: case *dwarf.IntType:
return thread.readInt(offaddr) return thread.readInt(offaddr, t.ByteSize)
case *dwarf.FloatType: case *dwarf.FloatType:
return thread.readFloat64(offaddr) return thread.readFloat64(offaddr)
} }
...@@ -225,15 +225,26 @@ func (thread *ThreadContext) readIntArray(addr uintptr, t *dwarf.ArrayType) (str ...@@ -225,15 +225,26 @@ func (thread *ThreadContext) readIntArray(addr uintptr, t *dwarf.ArrayType) (str
return str, nil return str, nil
} }
func (thread *ThreadContext) readInt(addr uintptr) (string, error) { func (thread *ThreadContext) readInt(addr uintptr, size int64) (string, error) {
val, err := thread.readMemory(addr, 8) var n int
val, err := thread.readMemory(addr, uintptr(size))
if err != nil { if err != nil {
return "", err 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) { func (thread *ThreadContext) readFloat64(addr uintptr) (string, error) {
......
...@@ -29,10 +29,12 @@ func TestVariableEvaluation(t *testing.T) { ...@@ -29,10 +29,12 @@ func TestVariableEvaluation(t *testing.T) {
{"a6", "main.FooBar {Baz: 8, Bur: word}", "main.FooBar"}, {"a6", "main.FooBar {Baz: 8, Bur: word}", "main.FooBar"},
{"a7", "*main.FooBar {Baz: 5, Bur: strum}", "*main.FooBar"}, {"a7", "*main.FooBar {Baz: 5, Bur: strum}", "*main.FooBar"},
{"baz", "bazburzum", "struct string"}, {"baz", "bazburzum", "struct string"},
{"neg", "-1", "int"},
{"i8", "1", "int8"},
} }
helper.WithTestProcess(executablePath, t, func(p *proctl.DebuggedProcess) { 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)) _, err := p.Break(uintptr(pc))
assertNoError(err, t, "Break() returned an error") assertNoError(err, t, "Break() returned an error")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册