动态断点

实现目标:清空断点

clearall命令的功能是为了快速移除所有断点,而不用通过clear -n <breakNo>逐个删除断点,适合添加了很多断点想快速清理的场景。

代码实现

clearall的实现逻辑,和clear逻辑差不多,相比较之下处理逻辑更简单点。

file: cmd/debug/clearall.go

package debug

import (
    "fmt"
    "syscall"

    "godbg/target"

    "github.com/spf13/cobra"
)

var clearallCmd = &cobra.Command{
    Use:   "clearall <n>",
    Short: "清除所有的断点",
    Long:  `清除所有的断点`,
    Annotations: map[string]string{
        cmdGroupKey: cmdGroupBreakpoints,
    },
    RunE: func(cmd *cobra.Command, args []string) error {
        fmt.Println("clearall")

        for _, brk := range breakpoints {
            n, err := syscall.PtracePokeData(TraceePID, brk.Addr, []byte{brk.Orig})
            if err != nil || n != 1 {
                return fmt.Errorf("清空断点失败: %v", err)
            }
        }

        breakpoints = map[uintptr]*target.Breakpoint{}
        fmt.Println("清空断点成功")
        return nil
    },
}

func init() {
    debugRootCmd.AddCommand(clearallCmd)
}

代码测试

首先运行一个待调试程序,获取其pid,然后通过godbg attach <pid>调试目标进程,首先通过命令disass显示汇编指令列表,然后执行b <locspec>命令添加几个断点。

godbg> b 0x4653af
break 0x4653af
添加断点成功
godbg> b 0x4653b6
break 0x4653b6
添加断点成功
godbg> b 0x4653c2
break 0x4653c2
添加断点成功

这里我们执行了3次断点添加操作,breakpoints可以看到添加的断点列表:

godbg> breakpoints
breakpoint[1] 0x4653af 
breakpoint[2] 0x4653b6 
breakpoint[3] 0x4653c2

然后我们执行clearall清空所有断点:

godbg> clearall
clearall 
清空断点成功

接下来再次执行breakpoints查看剩余的断点:

godbg> bs
godbg>

现在已经没有剩余断点了,我们的添加、清空断点的功能是正常的。

results matching ""

    No results matching ""