【疑难系列】 是程序卡住了还是怎么了?
时间:2019-06-16
本文章向大家介绍【疑难系列】 是程序卡住了还是怎么了?,主要包括【疑难系列】 是程序卡住了还是怎么了?使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
起因
客户说:“今天的预报又没有发出去,帮忙看下怎么回事?”
“...”
经过
登陆服务器,发现程序一直在打印
running
running
running
...
这是代码中写的
public static void Main(string[] args)
{
Console.Title = string.Format("Grib2压码程序 请勿关闭");
ActiveMq();
while (hasMessage)
{
Console.WriteLine("running");
Thread.Sleep(1000);
}
}
程序通过启动ActiveMQ,然后判断是否仍有消息在处理,如果在处理就Sleep当前线程,等待处理完毕
当接收到消息时的处理主逻辑:
public static void OnMessage(IMessage message)
{
var msg = message as ITextMessage;
if(msg != null)
{
hasMessage = true;
String date = msg.Text;
Compress(date);
mq.send(date);
hasMessage = false;
}
}
那么问题应该是Compress
或者 mq.send
一直在处理,卡住了??
因为是.net程序,所以不能用jstack来分析线程了
通过windows自带的任务管理器,把程序dump出来
然后使用windbg分析一下线程,直接通过文件, "open dump file",打开导出的dmp文件。
windbg第一次使用,不是很懂得使用,但是注意到右下角threads的线程信息,发现只有一个主线程在运行!!
也就是说:我们的监听线程退出了!!!
那么,什么情况下会退出呢?
一般是线程运行过程中抛出异常没有处理
检查源代码,发现程序没有对出现异常做任何处理
所以,修改方案如下:
public static void OnMessage(IMessage message)
{
var msg = message as ITextMessage;
if(msg != null)
{
hasMessage = true;
String date = msg.Text;
if(Compress(date, 3))
{
mq.send(date);
}
else
{
mq.fail(date);
}
hasMessage = false;
}
}
public static bool Compress(string date, int retry)
{
if (retry == 0)
{
return false;
}
try
{
Compress(date);
return true;
}
catch (Exception ex)
{
Log.writeException(ex);
return Compress(date, retry - 1);
}
}
将监听消息部分的代码进行修改,增加重试,并进行try catch异常处理,出现异常时,在文件中记录日志
当然mq.send
也有可能出现异常,将send方法也进行try catch异常处理
替换程序,上线运行(这种问题看能否重现了,重现了就可以在error.log中找到了)
总结分析
windbg第一应用,表示很多信息都看不懂
主线程中需要考虑子线程的异常,有些线程,你以为在运行,实际上它退出了
其它
面试的时候,面试官问我
“你遇到过最难解决的问题,你是怎么解决的?”
“我特么都是问题解决了就忘记了,所以没啥印象”
不过,我是在心里说的
所以,对于别人问我的问题,我决定记录下来,免得将来忘记了
原文地址:https://www.cnblogs.com/binblog/p/11030812.html
- asp.net web api 版本控制
- 如何编写更好的SQL查询:终极指南(上)
- asp.net web api 异常捕获
- asp.net web api 文件上传
- 使用MySQL正则表达式 __MySQL必知必会
- 史上最好用的免费翻蔷利器
- asp.net web api 接口安全与角色控制
- TensorFlow从0到1 | 第十五章 重新思考神经网络初始化
- asp.net web api 下载之断点续传
- apache2.4.x三种MPM介绍
- 没有自己的服务器如何学习生物数据分析(上篇)
- 【直播】我的基因组57:最简陋的祖源分析
- asp.net web api 使用Odata
- TensorFlow从0到1丨第十六篇 L2正则化对抗“过拟合”
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 知道吗?容器镜像也可以延迟拉取!
- ansible超详细讲解,值得收藏
- 实战渗透 - 一个怎么够?我全都要!
- 详解 Numpy 中的视图和副本
- 详解 matplotlib 中的两种标注方法
- 混搭 TypeScript + GraphQL + DI + Decorator 风格写 Node.js 应用
- 彻底搞懂闭包,柯里化,手写代码,金九银十不再丢分!
- Kubernetes控制器--副本集ReplicaSet
- Awesome Kubernetes 系列:第一期
- Mongodb多键索引之数组文档
- 在 Cocos Creator 里画个炫酷的雷达图
- 用shader做一个柿子颜色的过场动画
- mysql 找出最新时间的一条数据
- 【NPM库】- 0x05 - 文件、路径操作
- MySQL中insert阻塞问题的分析