Can';t调试golang应用程序delve,因为出现错误:无法附加到pid XXX:无法打开调试信息
因此,我想调试一个在k8s集群上运行的golang应用程序,但当我想将delve附加到该应用程序时,会收到错误消息“无法附加到pid XXX:无法打开调试信息” 在k8s部署中,我添加了所需的特权:Can';t调试golang应用程序delve,因为出现错误:无法附加到pid XXX:无法打开调试信息,go,debugging,remote-debugging,delve,Go,Debugging,Remote Debugging,Delve,因此,我想调试一个在k8s集群上运行的golang应用程序,但当我想将delve附加到该应用程序时,会收到错误消息“无法附加到pid XXX:无法打开调试信息” 在k8s部署中,我添加了所需的特权: securityContext: 能力: 加: -系统竞赛 特权:真的 runAsUser:0 allowPrivilegeEscalation:true 我用所需的gcflags“all=-N-l”编译了我的应用程序 go build-mod vendor-gcflags“all=-N-l”--
securityContext:
能力:
加:
-系统竞赛
特权:真的
runAsUser:0
allowPrivilegeEscalation:true
我用所需的gcflags“all=-N-l”编译了我的应用程序
go build-mod vendor-gcflags“all=-N-l”--ldflags-w-s-o应用程序
我以以下方式启动pod:
dlv--listen=:40000--headless=true--api version=2--accept multiclient exec/app
我验证了我运行了正确的容器映像,它与我推送的SHA哈希相同。
我验证了它也是哈希匹配的正确二进制文件
我已设定:
echo 0 > /proc/sys/kernel/yama/ptrace_scope
cat /proc/sys/kernel/yama/ptrace_scope
0
下面是二进制文件的readelf-S应用程序输出
readelf-S应用程序
共有27个节标题,从偏移量0x270开始:
章节标题:
[Nr]名称类型地址偏移量
大小EntSize标志链接信息对齐
[0]NULL 00000000000000000000
0000000000000000 0000000000000000 0 0 0
[1]。文本程序位0000000000 401000 000011000
000000000 223C47D 0000000000000000 AX 0 16
[2].plt程序位000000000 263D480 0223d480
0000000000000 29000000000000000 10 AX 0 16
[3].rodata PROGBITS 000000000 263E000 0223e000
0000000000 CD4919 0000000000000000 A 0 0 32
[4]。rela rela 000000000 3312920 02f12920
00000000000001800000000018A11008
[5].rela.plt rela 000000000 3312938 02f12938
0000000000000 3C0 0000000000000 18 A 11 2 8
[6].gnu.version\u r VERNEED 000000000 3312D002F12D00
00000000000000 50 0000000000000000 A 10 2 8
[7].gnu.version VSSYM 000000000 3312D60 02f12d60
00000000000000 5A 000000000000000 2 A 11 0 2
[8]。哈希值000000000 3312DC0 02f12dc0
00000000000000 D8 000000000000000 4 A 11 0 8
[9].shstrtab STRTAB 0000000000000000002f12ea0
0000000000000111 0000000000000000 0 0 1
[10] .dynstr STRTAB 000000000 3312FC0 02f12fc0
000000000000026800000000000000000A001
[11] .dynsym dynsym 000000000 3313240 02f13240
0000000000000438 000000000000018 A 10 1 8
[12] .typelink程序位000000000 3313680 02f13680
000000000001064C00000000000000000A0032
[13] .itablink程序位000000000 3323CD0 02f23cd0
000000000000 6A60 0000000000000000 A 0 0 8
[14] .gosymtab程序位000000000 332A730 02f2a730
0000000000000000 0000000000000000 A 0 0 1
[15] .gopclntab程序位000000000 332A740 02f2a740
000000000 113D450 0000000000000000 A 0 0 32
[16] .go.buildinfo程序000000000 4468000 04068000
00000000000000 20 0000000000000000 WA 0 0 16
[17] .动态000000000 4468020 0406820
0000000000000 130 00000000000000 10 WA 10 0 8
[18] .got.plt程序000000000 4468160 04068160
0000000000000 1580000000000000008 WA0 08
[19] .获得程序000000000 44682B8 040682b8
000000000000000 8 000000000000000 8 WA 0 0 8
[20] .noptrdata程序位000000000 44682C0 040682c0
00000000000885C000000000000000000WA032
[21].数据程序000000000 44F0880 040f0880
000000000001F6300000000000000000 WA 0 0 32
[22]bss NOBITS 000000000 450Fec0 0410fec0
000000000003ba90 0000000000000000 WA 0 0 32
[23]noptrbss NOBITS 000000000 454B960 0414b960
0000000000004708000000000000000000 WA 0 0 32
[24]待定编号00000000000000000000
000000000000000 8 0000000000000000瓦特0 0 8
[25].内部程序0000000000 400FE4 00000fe4
00000000000000 1C0000000000000000 A 0 0 1
[26].note.go.buildid note 0000000000 400F80 00000f80
00000000000000 64 0000000000000000 A 0 0 4
标志的关键点:
W(写入)、A(分配)、X(执行)、M(合并)、S(字符串)、I(信息),
L(链路顺序)、O(需要额外操作系统处理)、G(组)、T(TLS),
C(压缩)、x(未知)、o(特定于操作系统)、E(排除),
l(大),p(特定于处理器)
我不知道如何解决。您正在将-s-w
作为标志传递给链接器
根据报告:
-s:
省略符号表和调试信息
-w:
省略矮人符号表
简而言之,build命令将删除调试器调试所需的信息
如果删除-ldflags
(或仅删除-s-w
),则它应按预期工作