写点什么

Go dlv <autogenerate> 代码定位

用户头像
非晓为骁
关注
发布于: 刚刚

这个问题是在通过 dlv trace rt0_go 时候出现的,情况如下

打断点 runtime.args,出现如下内容

(dlv) b runtime.argsBreakpoint 1 set at 0x45e160 for runtime.args() <autogenerated>:1
复制代码

执行 continue,出现如下内容

(dlv) c> runtime.args() <autogenerated>:1 (hits total:1) (PC: 0x45e160)Warning: debugging optimized function
复制代码

正常打断点如下:

(dlv) b rt0_goBreakpoint 1 set at 0x459980 for runtime.rt0_go() /usr/local/go/src/runtime/asm_amd64.s:83(dlv) c> runtime.rt0_go() /usr/local/go/src/runtime/asm_amd64.s:83 (hits total:1) (PC: 0x459980)Warning: debugging optimized function    78: DATA _rt0_amd64_lib_argv<>(SB)/8, $0    79: GLOBL _rt0_amd64_lib_argv<>(SB),NOPTR, $8    80:    81: TEXT runtime·rt0_go(SB),NOSPLIT|TOPFRAME,$0    82:         // copy arguments forward on an even stack=>  83:         MOVQ    DI, AX          // argc    84:         MOVQ    SI, BX          // argv    85:         SUBQ    $(4*8+7), SP            // 2args 2auto    86:         ANDQ    $~15, SP    87:         MOVQ    AX, 16(SP)    88:         MOVQ    BX, 24(SP)
复制代码

会到具体的调用的地方,但是 runtime.args 不会,但这不是 runtime.args 的问题,查了下 delve 的 issue,看到这篇 issue:Step into autogenerated tail calls · Issue #1908 · go-delve/delve (github.com)

觉得问题看起来是 go 编译器会对某些代码生成一些 warpper,看着是调到 runtime.args,但是实际 disassemble 之后,不是我们打断点的地方,所以需要用比较不同的方式查看到真正调用到的函数,步骤如下(重头来的):

  1. b runtime.args

  2. c

前两步和之前一样

  1. disassemble


  1. 可以看到其实调 runtime.args 的地址是 0x45e184,我们需要做的就是打断点到 0x45e184

  2. b *0x45e184

  3. c

  4. disassemble


  1. si


就可以找到真正调用方法的地方


真正这个 go 编译器为什么会这么做,不太清楚,我的目的就是找到 autogenerate 后面真正调用的地方,有能解释明白 autogenerate 的朋友可以交流下

用户头像

非晓为骁

关注

no pain no gain 2019.04.10 加入

用我的勤奋,一点一点地努力,提升自己的能力,拓展自己的视野,提高自己的认知。

评论

发布
暂无评论
Go dlv <autogenerate> 代码定位