Can';t调试golang应用程序delve,因为出现错误:无法附加到pid XXX:无法打开调试信息

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”--

因此,我想调试一个在k8s集群上运行的golang应用程序,但当我想将delve附加到该应用程序时,会收到错误消息“无法附加到pid XXX:无法打开调试信息”

在k8s部署中,我添加了所需的特权:

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
),则它应按预期工作