使用StackStrace获取属性名称的惨痛教训

作者:V君 发布于:2017-7-21 18:04 Friday 分类:折腾手记

TL;DR: 改用 CallerMemberName 的方式.


必须扯,内容再少也要扯!

 

一直以来, 封装配置访问类时, 根据同样的只读属性名称去字典值或查数据库.

尽管比较新的 nameof 关键字可用, 但还是需要重复打字, 这非常不爽.


于是自作聪明的咱就抓取上一个堆栈帧, 取出方法名的方式代替Key.

定义一个无参方法 GetValue ,里面去抓 StackTrace, 

一般情况下, 只读属性的方法名是 get_XXXX, 这种情况直接去掉头就可以吃了.

然后只读属性的 getter 就直接无参调用 GetValue(),

看到一大堆只读属性调用同一个无参方法是不是很魔法啊? 乂目

  public string ConfA => GetValue();
  public string ConfB => GetValue();
  public string ConfC => GetValue(); 


然而, 二般情况出现了... 优化编译并 IL-Repack 之后 --

 只读访问器的堆栈帧不见了!!! EXM?!

错误地取到上一个方法的名字, 导致配置读不出来 囧....

即使在 GetValue 方法加上了 NotInlining 的特性, 问题仍旧存在...

放狗出去找爆栈, 在不太相关的问题上看到有说用 CallerMemberName 可以.

用了之后才知道爽, 问题解决了!

标签: 软件开发 C#

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

板载集成网卡问题导致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) 浏览(1644)

在MySQL用EF6遇到的那些坑

作者:V君 发布于:2017-6-20 16:12 Tuesday 分类:挖坑经验

把在 MySQL 用 EF 遇到的各种坑记下来,挂起假古文


首次创建迁移(初始迁移)之前应做好预处理:

避免生成的SQL语句有架构名称(dbo), 不这样做将会在今后的更新迁移中掉坑.

不要等你发现之后再加上这句, 要重建数据库才能避免更多问题.

 

(先记一个,有新的坑再追加, (´∀((☆ミつ)

标签: 软件开发 C# 数据库 ORM

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

活久见:有些异常是不能被catch(Exception)捕获的,你得把catch参数去掉

作者:V君 发布于:2017-6-14 0:25 Wednesday 分类:折腾手记

TL;DR: 

当你发现本应被捕获的异常却被无视 try-catch 语句时,

你应该试着去掉 catch(Exception ex) 中高亮的部分

写成 try {....} catch{....} 这种写法将不能直接取得异常实例,

你可以将上下文对象值记录下来作为排查线索。


本例:

将 MVC 5.2.3 站点部署到装了 mono 4.2.2 的Debian@树莓派。

首先就遇到一大堆兼容性问题。去掉一系列不兼容的组件。

(ApplicationInsights系列、CodeDom系列

总算能报出些看起来有点线索的异常。

System.Reflection.ReflectionTypeLoadException: The classes in the module cannot be loaded.
  at (wrapper managed-to-native) System.Reflection.Assembly:GetTypes (System.Reflection.Assembly,bool)
  at System.Reflection.Assembly.GetTypes () <0x721db540 + 0x00023> in <filename unknown>:0 
  at Ease.Ioc.IocManager.RegisterInterface (System.Reflection.Assembly[] assemblies, System.Type iface,
System.Func`1 lifetimeManager) <0x721db0c0 + 0x000fb> in <filename unknown>:0 
  at Ease.Ioc.IocManager..ctor () <0x721fb130 + 0x00283> in <filename unknown>:0 
  at Ease.Ioc.IocManager..cctor () <0x721faff8 + 0x00027> in <filename unknown>:0 

这是模仿 ABP 在当前应用域中的所有程序集中寻找实现了指定接口的类,然后加到 IoC 容器。

(哎……谁让 ABP 还不支持 mono 呢。。。)

在对某个程序集调用 GetType 时爆炸了……

于是在其周围加上常规异常处理 try-catch(Exception) 试图找出有问题的程序集。

然而异常依旧引发,就跟没写 try-catch(Exception) 一样……

试着调整方法结构,避免一些在首次访问方法就引发异常的状况 —— 无果……

心一横,去掉 catch 语句的参数,记下当前调用 GetTypes 的程序集。

try
{
types.AddRange(asm.GetTypes().Where(p => false == p.IsAbstract && false == p.IsInterface && iface.IsAssignableFrom(p)));
}
catch
{
throw new Exception("Asm load fail?" + asm);
}

功夫不负有心人 or 瞎猫撞上死耗子? bingo! 抓到你啦!

Asm load fail?System.Web.Helpers, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35

咋办? 没办法哇! 试着把引用干掉看看吧…… 果然就没事儿了!

稍稍去了解一下那玩意儿,发现是一堆辅助类, 反正一时半会也用不上。


于是就这样,用作类似 Hello world 的站点首页就成功呈现出来啦!

 —— 尽管是乱码…… 因为偷懒直接输出 Content 嘛! 接下来可以慢慢折腾啦!

标签: 软件开发 树莓派 C# linux mono 运行时错误

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

排查ASP.NET响应迟钝.用DebugDiag分析转储,再用WinDbg+sosex查看调用参数

作者:V君 发布于:2017-6-9 17:01 Friday 分类:填坑经验

WEB应用程序出现响应很慢甚至卡死的现象,

Server Admin 通过 DebugDiag 分析转储发现有个请求特别耗时间 (一个小时以上)


于是锅放到我这里辣.


DebugDiag得出堆栈已经显示具体代码位置了, 

想知道哪些数据被操作,还需要知道传入了哪些参数,这时候必须请出WinDbg+sosex了.

 

参考其 sosex 的 readme.txt MSDN文章 得知 !mk 命令可以查看当前线程调用堆栈

要切换当前线程 使用 ~*s 命令 (更多命令参见 windbg.info文章 )


搞起! .load sosex 再 ~*s 然后 !mk 这样就可以看到刚才的堆栈了,确保没选错线程

然而参数还没出来... 别急,呔! !mdso 列出当前线程堆栈上下文对象值

这个命令支持使用参数 /t:类名 来筛选结果. 这次排查过程顺利得有些出乎意料哇 乂目.

 

标签: 软件开发 ASP.NET 调试技术 windbg

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

Powered by emlog 去你妹的备案 sitemap