动态断点
实现目标:清空断点
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>
现在已经没有剩余断点了,我们的添加、清空断点的功能是正常的。