WebActivatorEx重复执行?不!那是作为使用者的我们傻逼!!

作者:V君 发布于:2018-6-15 22:42 Friday 分类:挖坑经验

TL;DR:

如果在发布新版本后出现疑似WebActivatorEx启动入口被执行多次的情况

首先检查bin里面是否有上个版本残留的DLL,干掉它们就解决了,然后把锅甩给运维

 

那么,开始我的故事。


~前奏~


由于首次在正式项目引入git源代码管理体系,仓库结构设计的相当散乱。

这不赶上重组git仓库,重新建立了解决方案,命名空间和项目名称也重新规划了。



好不容易发布一个新版本到测试环境,运行起来出现致命错误的黄页。

连最开始的初始化都没完成,错误处理也措手不及,好久不见的黄页就这样呈现出来。


~扯一扯~


由于不喜欢Log4Net这种只能用配置文件的充满Java味道的东西。

现在项目中的日志组件是由我自己实现的,有以下特性:

  • 由写入时间决定文件名
  • 6个级别,外加可选启用的虚拟级别“ALL”将其他级别内容凑一起输出
  • 按指定大小分文件
  • 多次启停可续写
  • 自动删除指定天数的旧文件

写入方式是基于线程安全的FileStream共享只读打开,方便边写边看。

内容格式是三行一空行的条目:

  • 第一行写时间、级别、线程信息(如果有写程序集,也能快速发现这次的问题。之后补上吧)
  • 第二行写摘要,由开使用者定义的简短摘要
  • 第三行写详情的JSON,有日志位置堆栈,可以加入任意对象作为附加信息

在日志组件初始化之后,我通常会打一句“Logger Init”在日志中体现应用程序启动。

我们有为此专门做了个小工具来分析日志,用上了Chris NielsenJSON可视化界面实现。


~诊断~


打住,话题收回来,黄页的错误信息是“文件被占用”,堆栈显示正在打“Logger Init”时…

一开始的时候很有自信,以为自己写的实现没问题,可能被文件共享出来占用了。

用Procexp查文件句柄,一个都没查出… 

但作为应用程序启动的体现“Logger Init”却被打进日志文件里…

老大的意思是想让我先把多节点负载均衡砍掉,以单节点跑起来,降低复杂度再诊断。

当时没辙只好听话照办喽,然并卯。

还是掏出诊断大杀器ProcMon看看“是谁动了我的奶酪”,看到结果时开始觉得自信不足了:

——真的是ASP.NET程序池进程访问的文件,而且是同一条原生线程访问了两次。

——第一次成功打开,第二次打开失败,最后还把文件关闭了——由CLR,程序都崩溃了嘛!

难道是自己的实现有问题,多线程竞态现象?

.NET的托管线程可能会复用原生线程,出现TID一样的情况也不能排除多线程。

在初始化的地方加了锁,然而问题依旧存在。其实并不是我的代码写的不严谨,这是后话。


咋办?


让文件打开的共享模式可读可写吧,想到了这样高风险的激进尝试。

然而——还是失败了,但仔细观察发现ProcMon监视条目详情有蹊跷:

第一次打开文件的共享模式是只读,第二次才是符合激进尝试的可读可写。

两次打开文件的原生堆栈有差异,很可惜看不到托管堆栈,如果能看到程序集就能解决问题了。

远程调试吧。没办法的办法了,在日志初始化的地方打个断点看看会不会两次命中。

调试结果令人十分失望,只命中了一次,打开失败的第二次。天知道第一次在哪儿打开?

这时猫同事建议我把“Logger Init”改一下,看看有没有打出来。这才恍然大悟。

我拒绝了建议,且断言上个版本残留程序集,去服务器bin看看,断言成立!

抓住运维的肩膀使劲晃,“你让我浪费了两天的时间排查” 乂目


~结语~


甩完锅之后还是要总结一下教训的,发布版本应该将之前的文件干掉,再把新的包部署上去。

标签: 软件开发 C# ASP.NET 软件故障诊断

评论(0) 引用(0) 浏览(97)

[成功]又一次自己编译Mono,这次是在Windows上,玩Bundle

作者:V君 发布于:2017-10-30 21:07 Monday 分类:折腾手记

目标 -- 将 .net 应用程序用只用一个 exe 承载, 并极大缩减体积, 且能保证工作正常.


(这次不是针对性的解决问题, 不TL;DR (´∀((☆ミつ 


篇幅较长, 进来看

阅读全文>>

标签: 软件开发 C# 命令行 mono 软件故障诊断

评论(0) 引用(0) 浏览(514)

板载集成网卡问题导致Flash加载失败

作者:V君 发布于:2017-6-23 16:57 Friday 分类:挖坑经验

终更:

关闭中断调整之后用了几天, 问题又出现了, 无论高级选项怎么整都没用.

只好花点钱搞一张独立网卡, 装上之后禁用原来的集成网卡, 问题解决...

推定集成网卡有毛病 _(:з」∠)_


原标题:

莫名其妙:有线网卡驱动设置「中断调整」Interrupt Moderation导致Flash加载失败EXM???


原内容:

TL;DR: 去属性高级,将其关闭,Flash 加载失败的问题解决. 不知道为啥!


点击查看原图



必须扯扯排查过程, 信息量太少了! (´∀((☆ミつ


一个WEB项目测试过程中发现 Flash 上传组件不工作, 右键显示为「影片未加载」.

然后发现只有这台机出现问题, 别的机器都好好的.

不仅上传组件, 所有的在线Flash都受影响.


试着直接在浏览器上输入 swf 的完整 url -- 失败

换IE/FF/360(测试的机器啥都有) -- 统统失败

试着在 Fiddler 中的 Composer 中发出请求, 得到的是超时代替的 504 错误.

最后 telnet 手动发起 HTTP 请求 -- 却能收到响应数据,尽管是一坨乱码,swf 是二进制的嘛!


排除了网络和 Sockets 组件的问题.

这时候只能怀疑是系统里面 Sockets 到浏览器之间出毛病了, 比如 wininet.dll 之类的.

这是没法轻易修复了, 就重装了系统.....


装完之后现象依旧存在, 三脸懵逼.


和重装之前没有变化的只剩下IP了.

由于我们为了方便访问, 设置了固定IP, 试着改一下IP,

居然成功访问了一次, 清除缓存之后又不行了.


只好发挥死马精神, 掏出一个 USB-WiFi 拇指头插上,禁用有线网卡 -- 故障现象消失

反过用有线网卡来能复现故障现象 -- 难道是有线网卡的锅???


抱着疑虑去看看调整MAC地址这类做法能不能打醒, 就去到网卡属性高级了.

眼前一亮, 发现好多奇怪的束手束脚设置, 比如节能啦,调整啦,减负啦 的.

一口气把能关的全部关掉, 然后居然 -- Flash 正常加载了... EXM???


清空缓存, 把配置打回去, 能复现, 这说明问题肯定在某些选项中.

见到「中断调整」这个选项比较不顺眼, 单独关掉之后 -- Flash 加载出来了!

又把它打开,清除缓存 -- 可复现!


于是就懵逼到这里. _(:з」∠)_ (´∀((☆ミつ




标签: 软件开发 软件故障诊断 HTTP Web技术

评论(0) 引用(0) 浏览(532)

RawCap抓包工具也不是万能的

作者:V君 发布于:2016-4-5 11:09 Tuesday 分类:填坑经验

TL;DR: 官方网站已经明确, 在XP之后的Windows上有以下限制, 看来只能用作回环抓包了.

Raw sockets limitations (OS dependent)

(略过两项)

External interfaces

Microsoft's newer operating systems (later than WinXP) have limitations associated with raw socket sniffing of external interfaces, i.e. everything that isn't localhost. Known limitations in Windows Vista and Win7 are:

  • Windows 7 - Can't capture incoming packets
  • Windows Vista - Can't capture outgoing packets

Due to these limitations in the raw sockets implementations of Microsoft's current operating systems we suggest running RawCap on Windows XP if you need to capture from external interfaces.


不扯不快:

说到抓包, 大家可能第一个想到的就是WireShark. 

然而这货想抓回环包要稍稍蛋疼的配置一下才能抓, 并且略庞大.

配置页面就提到可以用RawCap轻松抓取.

 

这次环境是2003, 想抓某个服务应用程序的包做故障诊断. 

WireShark提示系统版本太低不支持, 然而老版本安装包似乎不工作...

用RawCap在上面跑, 抓完打包回传, 发现只有接收的包, 没有发送的包.

然后回来看看官网, 果然是有限制的.


看来还是要老老实实修改现有程序加上收发数据日志.

我讨厌维护陈旧的各种编码不规范且自作聪明的项目

不能因为他们那时候因对基础类库不熟悉就原谅

标签: 软件故障诊断 抓包

评论(0) 引用(0) 浏览(1165)

TCPView未能完全统计网络活动-难道Sysinternals的工具不靠谱?

作者:V君 发布于:2016-4-1 21:26 Friday 分类:填坑经验

因为Sysinternals工具套装一直给我在软件故障诊断这类问题上带来优越的体验, 

我对它的信任也逐步提升甚至达到脑残粉级别.


最近, 我用其中的TCPView诊断服务器运行情况时

发现只显示连接发起, 没有显示这个连接的发送/接收的数据包或字节.

 

于是坚信咱们的服务程序有问题, 只是连接到对方而已, 并没有吐出数据.

 

由于这是很复杂的老项目, 出问题也一下子不知道是什么地方, 

只好放一边, 联系以前负责这个项目的人, 预约个时间来一起排查.

 

动摇: 等人来的这段时间中一次偶然的在自己的本子上跑起TCPView, 

发现只有系统进程才有收发数据统计,

别的绝大多数应用进程和在服务器遇到的情况一样 -- 有连接,但显示空的收发数据包和字节数.

唯独cFosSpeed的进程是有活动的, 可能是把别的进程流量集中到一起来调整优先级.

 

结果: 约到之前负责项目的人来一起解决问题, 他在另一端启动一个Socket调试工具.

启动监听 -- 发现确实有数据过来.


好吧, 我知错了. 可能复杂的服务器环境有类似cFos一样的东西来管理流量.


并不是说TCPView不靠谱, 而是显示的是系统层面真实的连接活动情况.

只不过这些连接活动可能受到个别软件影响.导致显示出的结果和实际有差别.

遇到这个问题的人不只是我, Sysinternals官方论坛也有人提到这个现象.


标签: 软件故障诊断 TCP Sysinternals 抓包

评论(0) 引用(0) 浏览(784)

Powered by emlog 去你妹的备案 sitemap