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

Improve support for int variable evaluation

上级 08aec0d5
......@@ -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() {
......
......@@ -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) {
......
......@@ -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")
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册