在尝试调试kubelet
中的紧急情况时,我一直未成功尝试将delve
附加到kubelet
可执行文件上:
me@mycomputer:~$ sudo dlv attach 23796
could not attach to pid 23796: could not open debug info
file
和objdump --syms
显示kubelet
中不包含任何调试信息:
me@mycomputer:~$ file _output/bin/kubelet
_output/bin/kubelet: ELF 64-bit LSB executable, x86-64, version 1
(SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=c7a1645940f91048eea9086bd0500deb7ec75b38, for
GNU/Linux 3.2.0, stripped
me@mycomputer:~$ objdump --syms _output/bin/kubelet
_output/bin/kubelet: file format elf64-x86-64
SYMBOL TABLE:
no symbols
我在构建kubelet
时尝试了不同的选择:
make WHAT=cmd/kubelet GOGCFLAGS=-dwarf
或:
make WHAT=cmd/kubelet GOFLAGS=-dwarf
,但可执行文件中仍未包含调试信息。在我看来,-w
默认包含go tool link
选项,该选项剥离DWARF符号表以节省最终可执行文件的大小(请参见here)。但是我无法扭转这种情况。
关于如何构建kubelet
以包括调试信息的任何想法?
答案 0 :(得分:1)
根据JimB的建议,go build
可以达到目的:
me@mycomputer:~/kubernetes/cmd/kubelet$ sudo go build kubelet.go
me@mycomputer:~/kubernetes/cmd/kubelet$ file ./kubelet
kubelet: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically
linked, interpreter /lib64/ld-linux-x86-64.so.2,
BuildID[sha1]=a1377345bfab4ca57b28af60eed92f23c81d7ae8, for GNU/Linux 3.2.0,
not stripped
可以看出,调试信息不再被删除[em] 。现在,您可以将输出复制到_output/bin
并使用delve
对其进行调试。