linux golang进程调试环境配置 dlv命令报错 总结详解

1. golang服务编译避坑

  • 现象:dlv 调试,p打印变量时无法正常打印,报错:Command failed: could not find symbol value for 变量
  • 解决方法:一定要加-gcflags "-N -l"参数(避面编译器内联和优化)
    go build -gflags “-N -l” -o main main.go

2. 生产环境go服务崩溃panic时自动生成core与调试

GO提供环境变量GOTRACEBACK,控制在panic时的行为。
2.1 增加系统变量 GOTRACEBACK(设置值为crash)
  • GOTRACEBACK=none 只输出panic异常信息

  • GOTRACEBACK=single 只输出被认为引发panic异常的那个goroutine的相关信息

  • GOTRACEBACK=all 输出所有goroutines的相关信息,除去与go runtime相关的stack frames.

  • GOTRACEBACK=system 输出所有goroutines的相关信息,包括与go runtime相关的stack frames,从而得知哪些goroutine是go runtime启动运行的

  • GOTRACEBACK=crash 与system的唯一区别是crash会生成coredump文件

2.2 设置系统参数ulimit

  • 第一步:在命令行执行ulimit -c,查看结果
  • 第二步:检查第一步命令执行结果,如果是unlimited,则到此结束,如果为0,则看第三步;
  • 第三步:执行ulimit -c unlimited,完成

2.3 设置core文件名和路径

2.3.1 查看当前core dump文件路径:

  • 方法1:
    cat /proc/sys/kernel/core_pattern
  • 方法2:
    /sbin/sysctl kernel.core_pattern

2.3.2 修改当前core dump文件路径:

方法1:临时修改:
修改/proc/sys/kernel/core_pattern文件,但/proc目录本身是动态加载的,每次系统重启都会重新加载,因此这种方法只能作为临时修改。
例:echo ‘/var/log/%e.core.%p’ > /proc/sys/kernel/core_pattern

方法2:永久修改:使用sysctl -w name=value命令。
例:/sbin/sysctl -w kernel.core_pattern=/var/log/%e.core.%p

为了更详尽的记录core dump当时的系统状态,可通过以下参数来丰富core文件的命名:
%% 单个%字符
%p 所dump进程的进程ID
%u 所dump进程的实际用户ID
%g 所dump进程的实际组ID
%s 导致本次core dump的信号
%t core dump的时间 (由1970年1月1日计起的秒数)
%h 主机名
%e 程序文件名

至此,可以成功生成core文件。

3. 调试core dump文件文件

  • 命令 dlv core main(服务名) main.core.123(core文件名)
    dlv命令此处不再赘述。
  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘帝阁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值