活久见:有些异常是不能被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 运行时错误
从源代码编译mono, 嵌入mono初体验
作者:V君 发布于:2016-11-29 23:19 Tuesday 分类:折腾手记
前些天定下的小目标还是纯属扯蛋, 还是先在健全的平台从编译运行调试开始练手吧.
TL;DR
本来想在Windows环境下编译, 但变着花样重试N多次仍未成功
才注意到官方git上的 Windows:build unstable
这下只能在Linux下完整编译, 然后回到windows单独编译可执行文件了
以前有在树莓派上编译ARMHF非常顺利的经历,
这次也圆润的通过了完整编译, 除了网络状况有点糟糕 (断开重试数次) :)
详细步骤:
阶段1 -- 获取源码并于Linux编译托管库
参照文档 http://www.mono-project.com/docs/compiling-mono/linux/
安装编译所需软件包
执行以下为我神奇国度做修改的脚本
mkdir mono
cd mono
git init
# 按需做以下科学配置, 否则只有10KB每秒, 一旦断开又得重头开始
# git config http.proxy "type://x.x.x.x:xxxx"
# git config https.proxy "type://x.x.x.x:xxxx"
# git config core.gitproxy "connector"
# core 配置需要指定连接适配才能工作
# 该步骤可能会被中断多次, 需要手动重试
git fetch --depth=1 https://github.com/mono/mono.git
# 得到输出 * branch HEAD -> FETCH_HEAD 才算结束
git checkout FETCH_HEAD
# 下面两个命令会从git拉取子模块, 被中断则需要重试
git submodule update --init --recursive
make get-monolite-latest
# 获取完源代码之后开始自动配置吧
./autogen.sh
# make可以指定并发数量, 按机器的处理能力改变j参数
make -j6
阶段2 -- 编译windows可执行文件
将文件打包带回Windows
参照以下文档做编译 -- 也就是载入解决方案, 选择x64目标, F6, 其中libtest编译失败不管
http://www.mono-project.com/docs/compiling-mono/windows/#build-mono-64-bit-using-visual-studio
阶段3 -- 调试
到这一步终于可以开始调试啦!
定位到解决方案文件夹EmbeddedSamples中
新增一个(4.5)控制台应用程序,叫做teste-csharp, 删掉默认的Program.cs和App.config
以链接的方式添加在编译目录samples\embed的test.cs文件, 编译它
最后在启动之前需要把核心托管库mscorlib.dll放到相应位置
它在 mcs\class\lib\net_4_x 我们已经在Linux上编译好了
复制到 msvc\build\sgen\x64\bin\lib\mono\4.5\ (创建目录)
然后是把编译好的.net控制台teste-csharp.exe也放到mono的windows执行引擎旁边
复制到 msvc\build\sgen\x64\bin\Debug
最后就是跑起来啦!
下图 第一个窗格定义了C语言写的方法,第二个窗格向运行时绑定,第三格就是C#代码了
小窗口是在输出目录用命令行启动编译好的EXE, 非常顺利!
嵌入了mono的EXE,不需要.NET Framework环境也能独立跑起来的C#!
当然还要安装VC++2015运行库, 和 .NET Framework 比起来小太多.
接下来还要多熟悉熟悉 看看能不能移植到PSV上 乂目.
[成功]搭建咕狗镜像
作者:V君 发布于:2016-9-17 23:12 Saturday 分类:折腾手记
尽管前段时间做的的半自动扶梯可以让咱在有环境的PC上尽情的咕狗,
然而在外面用便携设备上咕狗还是很困难
-- 找到的一个个镜像相继挂掉, 新的越来越少...
是时候自己搭一个了.
参考算法组上sys发表的文章 一键搭建谷歌镜像站
文章写得很详细, 不过对于没接触过nginx的新手(比如咱)就有点摸不着头脑
像配置文件在哪儿, 配置节点丢哪这种问题
所以才会有这篇文章写下更详细的步骤.
原文命令步骤就不照搬了, 这次只讲讲咱的经历.
首先尝试了最简安装, 失败了, 估计是主机提供商已经安装有软件包还自己编译, 搞糊了...
重新初始化主机实例后尝试从发行版迁移, 成功了!
安装软件包和获取源码后的解压缩命令并没有包含在原文
tar xzvf nginx-1.4.7.tar.gz
进去配置然后编译吧, cd nginx-1.4.7/
configure参数按照 nginx -V 吐出的内容外加文章中的最后两行, 增加两个额外模块
然后执行一下文中没点到的 make , 继续往下走, 直到服务启动OK
接着更改配置文件, 和apache类似, 在 /etc/nginx/nginx.conf
找到 http { 节点,在对应的 } 前面加上文章中的server配置内容, 注意你的域名以及端口.
保存后重启服务就可以吃辣!
可能是主机提供商的环境有点怪, 常规的 update-rc.d 不起作用.
只好在 /etc/profile 最后加上一行 sudo service nginx start 就这样歪着实现自启动啦!
~EOF
[失败]修改 ASP.NET Boilerplate 0.9.1 源代码, 让其支持 Mono
作者:V君 发布于:2016-6-25 15:25 Saturday 分类:折腾手记
直接部署能在IIS上跑的版本到Linux Mono(树莓)上会报错.
看来ABP没有考虑平台兼容啊,只能自己改改看了
▲Directory '****/bin\' not found.
at System.IO.Directory.GetFiles (System.String path, System.String searchPattern, SearchOption searchOption) <0x71c1cbb0 + 0x0002b> in <filename unknown>:0
at Abp.Web.WebAssemblyFinder.GetAllAssembliesInternal () <0x71c1bcd0 + 0x000eb> in <filename unknown>:0
一看就知道是没考虑兼容Linux,直接写死的反斜杠,
找到 WebAssemblyFinder 对应源代码第50行
将bin后面反斜杠改成目录分隔符或直接删掉.
▲No currently authenticated user.
at System.Web.HttpApplication.get_User () <0x6f94e678 + 0x000d4> in <filename unknown>:0
at Abp.Web.AbpWebApplication.TrySetTenantId () <0x6f94e328 + 0x0002b> in <filename unknown>:0
去看了源代码 AbpWebApplication 类第112行的取得用户, 再反编译跟进去
发现系统类库居然在取不到值时抛出异常, 果断加个try, 遇到异常时就当做取到空.
▲Could not find method overriding System.Threading.Tasks.Task`1[Abp.Auditing.AuditLog] InsertAsync(Abp.Auditing.AuditLog) on type Abp.EntityFramework.Repositories.EfRepositoryBase.....
at Castle.DynamicProxy.Internal.InvocationHelper.ObtainMethod......
我去,不仅Abp本身没考虑, 就连AOP代理拦截的Castle也不支持?!
接着找Castle的源代码, Abp 0.9.1 使用的 Castle 是 3.3.0, 根据异常堆栈跟进去看.
插入调试代码发现更多细节, System.Threading.Tasks.Task`1[Abp.Auditing.AuditLog] InsertAsync(Abp.Auditing.AuditLog) 报错的原因是找不到这个方法,
造成找不到方法的原因是 Castle 对要做的方法取了 GetBaseDefinition 来做签名比较
得到了 System.Threading.Tasks.Task`1[TEntity] InsertAsync(TEntity)
明显和要找的方法不匹配. 源代码里也注释了一句
this implementation sucks, feel free to improve it.
好吧, 那么就动手改改吧, 虽然不知道为啥要取 GetBaseDefinition
那么就在你找不到之后接着不 GetBaseDefinition 然后比较吧.
▲Failure has occurred while loading a type.
at Abp.Domain.Uow.UnitOfWorkInterceptor.Intercept (IInvocation invocation) <0x6f8e8688 + 0x0007f> in <filename unknown>:0
懵逼了,不知道这个异常是怎样引发的..
先放着不管, 找到法子再更吧
等 .NET Core 的ARM版本软件包出现, 或许可以不做修改直接跑了吧。
M¥给点力快点啊。。。
标签: 软件开发 树莓派 C# linux mono MVC
在Debian Linux搭建rsync备份服务端并在windows使用客户端
作者:V君 发布于:2016-2-24 18:38 Wednesday 分类:折腾手记
和SD卡一样的尿性, U盘也是这么脆.
一直都每周手动复制一次到硬盘, 最近忙成狗偷懒每隔一两个月才复制一次.
这下好了, 赶上U盘挂掉连WinHEX读扇区都读不动, 最近个把月的东西就这样没了...
收假, 回到doge之地. 开始找法子自动备份.
咕狗一圈回来发现rsync, 搞起.
服务器当然是用XX pi,直接apt-get install rsync发现已经装有了, 点个赞继续配置.
编辑文件 /etc/rsyncd.conf
uid = root
gid = root
max connections = 2
[repo1]
path = /path/to/your/repo1
auth users = account1,account2,account3
read only = false
secrets file = /path/to/your/conf/repo1.secrets
secrets文件格式要求每行一个用冒号隔开的用户名和密码
secrets文件必须将设置权限为600
写好配置文件, 然后是启动服务 rsync rsyncd --daemon
将这个命令加到 rc.local 就可以开机启动了.
接下来是客户端了, windows 可以用 DeltaCopy 这货做客户端.
添加好profile之后右键立即执行, 首次运行会把所有文件发到服务器.
以后运行就只发修改的部分.
关于虚拟目录需要注意的地方
在默认情况下DeltaCopy会自动设置虚拟目录.
如果设置profile目录是驱动器根目录时啥问题都没有, 他就对应repo的根.
当你指定了子文件夹, 那么最后一个子文件夹名会被当做虚拟目录
你要还原也必须用同名文件夹
因此同一个repo如果指定驱动器根目录, 那么就不要再加别的文件夹进来, 不然会混乱.
如果所有的项都是子目录, 那么允许在同一个repo里. 当然你可以手动修改拟路径.
blogger
Google Web Translator
热门日志
随机日志
最新日志
最新评论
- V君
@Quartz:(出现)... - Quartz
怎么不见人了呢... - V君
@Soar:DHCP 协议相... - V君
@Soar:当然是非... - Soar
@V君:谢谢 有空... - Soar
搞一个 1230v3+B85... - V君
@Soar:另外,也可... - V君
@Soar:iscsi服务端... - Soar
难怪这么卡,尤其... - Soar
clone了源码,提示...
分类
存档
- 2024年5月(1)
- 2023年7月(1)
- 2023年5月(1)
- 2022年11月(1)
- 2022年10月(1)
- 2022年9月(1)
- 2022年8月(1)
- 2022年7月(1)
- 2022年6月(1)
- 2022年5月(2)
- 2022年4月(1)
- 2022年3月(1)
- 2022年2月(1)
- 2022年1月(1)
- 2021年12月(1)
- 2021年11月(1)
- 2021年10月(1)
- 2021年9月(1)
- 2021年8月(1)
- 2021年7月(1)
- 2021年6月(1)
- 2021年5月(1)
- 2021年4月(1)
- 2021年3月(1)
- 2021年2月(1)
- 2021年1月(1)
- 2020年12月(1)
- 2020年11月(1)
- 2020年10月(2)
- 2020年9月(1)
- 2020年8月(1)
- 2020年7月(1)
- 2020年6月(1)
- 2020年5月(1)
- 2020年4月(2)
- 2020年3月(3)
- 2020年2月(1)
- 2020年1月(1)
- 2019年12月(1)
- 2019年11月(1)
- 2019年10月(1)
- 2019年9月(1)
- 2019年8月(2)
- 2019年7月(1)
- 2019年6月(1)
- 2019年5月(1)
- 2019年4月(1)
- 2019年3月(1)
- 2019年2月(1)
- 2019年1月(2)
- 2018年12月(2)
- 2018年11月(1)
- 2018年10月(3)
- 2018年9月(4)
- 2018年8月(6)
- 2018年7月(4)
- 2018年6月(1)
- 2018年5月(2)
- 2018年4月(2)
- 2018年3月(3)
- 2018年2月(1)
- 2018年1月(1)
- 2017年12月(1)
- 2017年10月(2)
- 2017年9月(1)
- 2017年8月(2)
- 2017年7月(1)
- 2017年6月(5)
- 2017年5月(2)
- 2017年4月(2)
- 2017年3月(3)
- 2017年2月(2)
- 2017年1月(2)
- 2016年12月(3)
- 2016年11月(2)
- 2016年10月(3)
- 2016年9月(4)
- 2016年8月(2)
- 2016年7月(4)
- 2016年6月(3)
- 2016年5月(1)
- 2016年4月(4)
- 2016年3月(3)
- 2016年2月(1)
- 2016年1月(5)
- 2015年12月(4)
- 2015年11月(5)
- 2015年10月(1)
- 2015年9月(6)
- 2015年8月(4)
- 2015年7月(1)
- 2015年6月(6)
- 2015年5月(3)
- 2015年4月(3)
- 2015年3月(2)
- 2015年2月(1)
- 2015年1月(3)
- 2014年12月(1)
- 2014年11月(1)
- 2014年10月(1)
- 2014年9月(3)
- 2014年8月(1)
- 2014年7月(1)
- 2014年6月(1)
- 2014年5月(3)
- 2014年4月(1)
- 2014年3月(1)
- 2014年2月(2)
- 2014年1月(1)
- 2013年12月(2)
- 2013年11月(2)
- 2013年10月(1)
- 2013年9月(3)
- 2013年8月(14)
- 2013年7月(7)
- 2013年4月(1)
- 2013年3月(4)
- 2013年2月(6)
- 2013年1月(6)
- 2012年12月(8)
- 2012年11月(6)