一次k8s docker下.net程序的异常行为dump诊断
背景
昨天,一位朋友找到我寻求帮助。他的项目需要调用一个第三方项目的webAPI。这个webAPI本身可从header, query string中取相关信息,但同事发现他在调用时,无法按期望的那样从query string中传参数给到第三方webAPI (webAPI仿佛忽略了从query string过来的信息),朋友不知道是这个webAPI的问题,还是自己调用代码的问题了。。
由于这个webAPI service是他们公司内部的某team的项目,所以朋友虽然可以看到源码,但他并不能快速确定原因, 维护项目的人又不好找。通过webAPI service代码他自己找到了可疑的原因是webAPI中的这个方法有可能阻挡了他期望的webAPI行为: Instance.EnableFallback() (公司隐私,改了名), 但他无法确定这个方法在实际运行的时候的具体返回值。
听了朋友介绍,我能想到的一个方法是看一下他们公司的这个第三方的service进程的内部情况
(非生产环境,权限是允许的)
分析
通过kubectl exec -it [namespace:pod] /bin/bash,我们成功进入了service的pod里。虽然是非生产环境,我们也尽量别打扰人家干活
那么…就选择dump一下运行的dotnet进程喽
由于这次的任务是观察托管环境的某个内存位置的值,我选择了用dotnet-dump

然后dotnet-dump analyze core_123 开始分析。
我们想要的是 Instance.EnableFallback 的返回值,而我的朋友已经知道这个Instance的type,所以用dumpheap -type找一下这个instance在哪里:

然后用!do一下instance具体内容:
1 > do 796f3840d080
2 Name: XXX.Common.XXX.XXXInstance
3 MethodTable: 00007970d459d3a8
4 EEClass: 00007970d45a4fc0
5 Size: 80(0x50) bytes
6 File: /app/XXX.dll
7 Fields:
8 MT Field Offset Type VT Attr Value Name
9 00007970d459d9e8 4000016 10 ...XXX]] 0 instance 0000796f3840d130 _evs
根据简化和隐藏敏感信息后的代码:

知道了需要继续用!do 看这个0000796f3840d130:
1 > do 0000796f3840d130
2 Name: System.Collections.Generic.Dictionary`2[[System.String, System.Private.CoreLib],[XXX.Common.XXX.XXXEnv, XXX]]
3 MethodTable: 00007970d459d718
4 EEClass: 00007970ce610c00
5 Size: 72(0x48) bytes
6 File: /usr/share/dotnet/shared/Microsoft.NETCore.App/3.1.32/System.Private.CoreLib.dll
7 Fields:
8 MT Field Offset Type VT Attr Value Name
9 00007970ce636448 4001aec 8 System.Int32[] 0 instance 0000796f384143a8 _buckets
10 00007970ce636250 4001aed 10 ...ivate.CoreLib]][] 0 instance 0000796f384143d0 _entries
11 00007970ce5fa0e8 4001aee 30 System.Int32 1 instance 1 _count
大家如果了解.net Dictionary类型的实现,就知道目前这个dictionary是1size且具体的item值可以直接用!dp看:

Dictionary里的_entries是个数组,item类型是value type,所以是inlined memory, 所以直接看0000796f38412948, 因为他是数组中第0个元素里的key-value pair里的value(XXXEnv instance的地址)。
1 > do 0000796f38412948
2 Name: XXX.Common.XXXEnv
3 MethodTable: 00007970d459e700
4 EEClass: 00007970d45a5888
5 Size: 56(0x38) bytes
6 File: /app/XXX.dll
7 Fields:
8 MT Field Offset Type VT Attr Value Name
9 00007970d340a988 400000a 8 ....Config.XXXConfig 0 instance 0000796f382898f0 _toggleConfig
最后看那个_toggleConfig,Instance.EnableFallback()里面一通调用最终会读它的内容,简化代码如下:

所以继续!do看一下这个_toggleConfig:

至此原因确定,怀疑的这个方法在当前这个webAPI service下会返回false.
后记
也许有朋友会问,直接dump type是XXXConfig的instance不就行了。是的,不过在这个dump文件中,我发现了不止一个active的XXXConfig instance, 也就是说不止一处会用到这个不唯一的XXXConfig, 而我需要明确Instance.EnableFallback最终的返回,所以需要耐心探索哈 
总结
我的朋友知道了他想确定的Instance.EnableFallback在第三方service运行的时候的真实值之后,也明确了他那边的应对这个webAPI的调用方式了。
这次诊断的问题虽不是cpu过高、内存泄漏这类资源问题,但还是用上了与排查资源泄漏相同的底层调试诊断技术来解决。最后我的朋友很高兴,吃了个定心丸
一次k8s docker下.net程序的异常行为dump诊断的更多相关文章
- Win32环境下的程序崩溃异常定位
1 案例描述 作为Windows程序员,平时最担心见到的事情可能就是程序发生了崩溃(异常),这时Windows会提示该程序执行了非法操作,即将关闭.请与您的供应商联系.呵呵,这句微软的“名 ...
- 在Java大环境下.NET程序员如何夺得一线生机
先来看一组数据,从某招聘网站直接检索3-4w的岗位,会看到Java与.NET社会需求量的巨大差异,这里就不再对比高薪的岗位了,.NET的高薪岗位更是少的可怜: 笔者从业十余年,一直是在.NET圈子 ...
- k8s&docker面试总结
花了大半个月对k8s&docker进行了梳理,包括之前读过的书,官方文档以及k&d在公司项目的实践等. 以下是个人对docker & k8s 面试知识点的总结: 1 docke ...
- 【原创】K8S环境下研发如何本地调试?kt-connect使用详解
K8S环境下研发如何本地调试?kt-connect使用详解 背景 注:背景有点啰嗦,讲讲一路走来研发本地调试的变化,嫌烦的可以直接跳过,不影响阅读. 2019年 我在的公司当时是个什么情况,只有两个J ...
- Docker安装应用程序(Centos6.5_x64)
Docker安装应用程序(Centos6.5_x64) Authoer::jom_ch@2014/7/23 Docker官方网站 http://www.docker.com/ 一,安装EPEL 关于E ...
- Docker下redis的主从、持久化配置
Docker下redis的主从.持久化配置 redis是k-v型nosql数据库,支持字符串(string).列表(list).集合(set).散列(hash).有序集合(zset:形如member: ...
- dotnet core调试docker下生成的dump文件
最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象,有时会突然吃掉几个G,触发监控预警,造成容器重启. 分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发 ...
- docker下安装 Oracle11gR2
这是第二次安装,在第一次安装过程部分内容参考自如下: http://blog.sina.com.cn/s/blog_d840ff330102v4j0.html docker下oracle11g安装 h ...
- Docker下使用disconf:细说demo开发
Docker下的disconf实战全文链接 <Docker搭建disconf环境,三部曲之一:极速搭建disconf>: <Docker搭建disconf环境,三部曲之二:本地快速构 ...
- Docker下kafka学习三部曲之一:极速体验kafka
Kafka是一种高吞吐量的分布式发布订阅消息系统,从本章开始我们先极速体验,再实战docker下搭建kafka环境,最后开发一个java web应用来体验kafka服务. 我们一起用最快的速度体验ka ...
随机推荐
- Flask框架使用SQLAlchemy的ORM
SQLAlchemy 1.介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB API之上,使用关系对象映射进行数据库操作,简言之便是:将类和对象转换成SQL,然后使用 ...
- 【Spring专题】「开发指南」夯实实战基础功底之解读logback-spring.xml文件的详解实现
logback的maven配置 <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j- ...
- DP经典例题——LIS&LCS
DP经典例题--LIS&LCS LCS 最长公共子序列,英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列 ...
- pulsar集群搭建——生产环境
pulsar集群搭建 前置条件,需要JDK环境 192.168.1.1 192.168.1.2 192.168.1.3 写入hosts 所有机器都需要执行 $ cat >>/etc/hos ...
- 发布了一个jar包到中央仓库,我的心好累…
原创:微信公众号 码农参上,欢迎分享,转载请保留出处. 哈喽大家好啊,我是Hydra. 前几天我在网上冲浪的时候,看见有一个老铁在git上给我提了一个issue: 万万没想到,有一天我写的烂代码居然也 ...
- [深度探索C++对象模型]memcpy和memset注意事项
不管使用memcpy()还是memset(),都只有在"classes不含任何由编译器产生的内部members"时才能运行.如果这个类声明一个或者一个以上的virtual func ...
- iOS14新特性
6月23日凌晨,苹果首次在线上举办全球开发者大会WWDC2020.在大会上,苹果对iOS.iPadOS.macOS.watchOS.tvOS进行更新,其中大家最关心的iOS14,主要更新了36个功能. ...
- webpack 中 loader 和 plugin 的区别
通俗点讲loader是转换,plugin是执行比转换更复杂的任务,比如合并压缩等 loader:让webpack能够处理非js文件,然后你就可以利用 webpack 的打包能力,对它们进行处理. 例如 ...
- 修改hosts文件需要vi命令
i 在光标前插入. 保存 按esc后 shift+: 输入wq! 保存
- 数据结构-详解优先队列的二叉堆(最大堆)原理、实现和应用-C和Python
一.堆的基础 1.1 优先队列和堆 优先队列(Priority Queue):特殊的"队列",取出元素顺序是按元素优先权(关键字)大小,而非元素进入队列的先后顺序. 若采用数组或链 ...