启动进程,没什么特殊的,和之前指令级调试的时候没什么不同。

只是说为了方便,我们可以增加一些新命令,比如:

  • godbg exec,执行可执行程序并调试
  • godbg attach,attach到运行中的进程

  • TODO:godbg debug,调试当前go module,这里可能涉及到一个自动编译过程

    涉及到一些编译选项注意一下:go build -gcflags "all=-N -l"

任务优先级:低

修复了一个bug,attach pid时:

  • 先ptrace attach到这个进程(线程)
  • 然后proc读取其exec文件路径,并通过symbol.Analyze完成DWARF信息的加载解析,这个后面建议重写,没有调用栈信息表、行号表等,直接使用go-delve/delve中的dwarf package重写
  • proc读取comm信息,这里记录下当时启动时的命令、proc读取cmdline,这里记录下命令行参数信息。记录命令行及其参数,是为了方便后面支持restart
  • 再然后更新线程列表
    • proc下读取所有线程id,
    • 对上述所有线程全部ptrace attach,这之后意味着进程下的所有线程都被ptrace跟踪了呀,都不能跑了呀。符合预期否?符合,就是不希望它跑嘛。
    • 并且为每个线程都设置了一个选项PTRACE_O_TRACECLONE选项,什么意思呢,就是说从这个线程创建出来的所有新线程都将被ptrace自动跟踪,内核负责处理这个事情。

还有问题:

  • 首先明确main.main是由main goroutine来执行的,但是main goroutine并一定有main thread来调度,这将有助于明确为什么我们已经attach了pid,但是main goroutine依然在执行的问题。

  • 如何让线程停下来,这就涉及到多线程调试的问题了,我们需要attach所有已经创建的线程,还要attach所有后续新创建的线程。

results matching ""

    No results matching ""