| 76 | } |
| 77 | |
| 78 | func ParseMsg(payload []byte) (*BrkOptions, error) { |
| 79 | brk := new(BrkOptions) |
| 80 | brk_raw := new(BrkOptionsRaw) |
| 81 | err := json.Unmarshal(payload, brk_raw) |
| 82 | if err != nil { |
| 83 | return nil, err |
| 84 | } |
| 85 | brk.BrkPid = brk_raw.BrkPid |
| 86 | brk.BrkLen = brk_raw.BrkLen |
| 87 | |
| 88 | switch brk_raw.BrkType { |
| 89 | case "r": |
| 90 | brk.BrkType = util.HW_BREAKPOINT_R |
| 91 | case "w": |
| 92 | brk.BrkType = util.HW_BREAKPOINT_W |
| 93 | case "x": |
| 94 | brk.BrkType = util.HW_BREAKPOINT_X |
| 95 | case "rw": |
| 96 | brk.BrkType = util.HW_BREAKPOINT_RW |
| 97 | default: |
| 98 | return nil, errors.New(fmt.Sprintf("breakpoint type:%s is not supported", brk_raw.BrkType)) |
| 99 | } |
| 100 | addr, err := strconv.ParseUint(strings.TrimPrefix(brk_raw.BrkAddr, "0x"), 16, 64) |
| 101 | if err != nil { |
| 102 | return nil, errors.New(fmt.Sprintf("parse for %s failed, err:%v", brk_raw.BrkAddr, err)) |
| 103 | } |
| 104 | brk.BrkAddr = addr |
| 105 | return brk, nil |
| 106 | } |
| 107 | |
| 108 | func StartRpcServer(stopper chan os.Signal, rpcPath string) { |
| 109 | addr, err := net.ResolveTCPAddr("tcp4", rpcPath) |