CS端开发问题汇总

阅读: 评论:0

CS端开发问题汇总
0、先推荐⼏款⼯具,连接远程客户端DameWare Mini Remote Control,搜索本地⽂件Everything,以及sysinternals的系列⼯具:
FileMon-监视所有⽂件修改、RegMon-监视所有注册表修改、ProcessExplorer-任务管理器、ProcessMonitor-监视进程对⽂件+注册表的所有操作socket通信
SigCheck-识别⽂件头+签名+对应的pbd、TcpView-监视所有tcp连接、PsTools系列⼯具-操作所有本地+远程进程
1、在⼀些基于Server 2008 R2的终端机上,经常会出现多⽤户进程抢占同⼀⽂件(⽐如menuverison.ini)的问题,报IOException,对路径的访问被拒绝。
类似的,多个进程写同⼀个xml⽂件时,会报“缺少根元素”或“根级别上的数据⽆效”,应该也是类似的问题。
答:这类问题⽤lock{}是不够的,lock(Monito)只能同步单进程⾥多个线程对资源的访问,这种跨进程的同步要使⽤内核锁,⽐如基于事件的AutoResetEvent或基于信号量的Mutex。
2、未能加载⽂件或程序集xxx.client.dll或它的某⼀个依赖项。
答:这是客户端更新程序下载dll不完整引起的,初步认为是⽹络层⾯的问题,导致⽂件接收不完整。不妨讨论⼀下客户端的更新策略:
1)⽤⼀个单独的更新程序updator更新dll和resource⽂件,更新程序可以在系统启动前检测、也可以以服务的形式在services.msc⾥运⾏。
2)更新内容打包成msi/exe/补丁包的形式,更新程序只负责检测、下载、安装更新包。
3)也可以做成安装包后,由企业域推送、SCCM、VRV等⼯具推送到⽤户机器上。奥巴马会见喇嘛
注:⽅法2保证了⽂件的完整性,但要求⽤户有管理员的安装权限,在企业环境⾥还不如⽤⽅法3。⽅法1需要⽤hash值等⽅法验证⽂件的完整性,不然就容易出现如上错误。
3、⽤户机器上⼤规模报出ora-12500、ora-12535、ora-12541等错误。
答:DB服务器上%ORACLE_HOME%/Network/log/listener.log⾥的⽇志如下:
TNS-12500: TNS: listener failed to start a dedicated server process
TNS-12540: TNS: internal limit restriction exceeded
TNS-12560: TNS: protocol adapter error
TNS-00510: internal limit restriction exceeded
HPUX Error: 11: resource temporarily unavailable
看起来主要是tns⽆法启动进程,db服务器是8核CPU、64G内存,实际只⽤了32G。从oracle来看,⽤户session数只有200,没有达到最⼤值300。因此猜测是服务器的设置问题,搜索⼀下,据说可以把maxupro=nproc*90%,原本maxupro为256,改成3000,同时把
ulimit->nofiles从2048改为4096,貌似问题得到了缓解,⽤户session也顺利超过200。
4、ftp服务器平时正常,某天突然拥堵,ftp server⾥看到⼤量客户端排队,每个客户端速度只有3K左右。不抛错不出异常,进度条始终停在下载处。
答:⼀开始在DB服务器⾥输⼊netstat -ano | findstr TIME_WAIT > netstat.log看到有⼤量的TIME_WAIT状态。注意到fig-
>customBinding->httpTransport->keepAliveEnabled=false,设置为true后是否能⽤client端的长连接代替多次的短连接。设置后,DB 服务器⾥TIME_WAIT确实下去了,但ftp服务器还是会偶尔出现拥堵
的情况。后来,考虑到这个情况是偶尔出现的,应该与代码⽆关,由运维室监控⽹络层⾯,发现这台机器丢包很严重。监测下来,ftp服务器有1G的带宽,但直连的路由器只有百M的速度,后来换路由后解决问题。
5、ClickOnce⽆法启动应⽤程序,激活appref-ms异常。
答:猜测是由于ClickOnce更新到⼀半,⽹络问题或是ClickOnce⾃⼰的Bug造成的程序⽂件损坏或与注册表中的版本不⼀致。
解决⽅法:1)将c:\Documents and Settings\n176197\Local Settings\Apps\下的2.0⽂件夹删除,重新打开桌⾯图标即可。
2)或者打开Regedit,将
HKEY_CURRENT_USER\Software\Classes\Software\Microsoft\Windows\CurrentVersion\Deployment节点下的所有内容全部删除,重新双击桌⾯的appref-ms图标即可。
6、第三⽅控件相关问题:regsvr32注册:DllRegisterServer失败,返回代码是0x80004005。或报检索COM类⼯⼚中CLSID为{4764040E-4222-4DEC-9F2E-82D46E212B3A}的组件时失败,原因是出现如下错误0x80040154。
让子弹飞 配乐
答:1)由于域环境下,⽤户没有安装权限、也没有注册com组件(常见的如⽔晶报表CrystalReport、PDF控件PDFSDK、FastReport 等)的权限。所以新装的机器很容易出现控件未注册的问题。只需要以管理员权限注册即可,如果权限不⾜,会报上述0x错误。
runas /user:domain\admin cmd
regsvr32 fastreport3.dll
cacls c:\client /t /g everyone:C
2)有时Guid指向的是组件,可以把⾃⼰机器上的拷贝到⽤户机器上,⽤管理员运⾏ regsvr32
c:\windows\dwrcs\,注意不加/i选项,OK!
7、Client更新出错,弹出MessageBox说对系统Temp⽬录⽆访问权限。
答:在使⽤临时⽬录时,有时会出现获取到的临时⽬录没有权限。⼀般来说,调⽤Path.GetTempPath()⽅法应该返回⽤户的临时⽬录,⽐如c:\Documents and Settings\user\Local Settings\Temp。但某些⽤户切换过⽤户⽬录后,出现以wangyu1登录,登录成功后开始菜单⾥显⽰的
是wangyuwy(估计是iNode⾥设置的⽤户名),但在c:\Documents and Settings\⾥的⽬录名却是wy。由于
Path.GetTempPath()⾥调⽤的是Win32Native.GetTempPath,所以只能猜测这个⽅法想按照⽤户名wangyu1去获取临时⽬录,没取到,于是取系统临时⽬录,但是⼜没权限。
解决⽅法:1)备份⽤户资料->注销当前⽤户(或者直接重启,否则已经登录过的⽤户⽆法删除)->以管理员⾝份登录->系统属性->⾼级->⽤户配置⽂件->删除错误的⽤户->注销->以正确的⽤户名登录->创建对应的⽂件夹->把备份的资料覆盖回来。
2)简单的⽅法是:给系统临时⽬录赋every读写权限,cacls c:\windows\temp /E /G everyone:C
3)也有可能是C盘空间不⾜,不妨cleanmgr /sagaset:99,清空所有回收站、压缩旧⽂件。
8、TCP error code 10048通常每个套接字地址(协议⽹络地址端⼝)只允许使⽤⼀次。
答:问题其实很明确,可以从以下⼏个⽅⾯考虑:
1)是否所有client都指定同⼀个server端⼝;
2)client每次通信完成后是否有释放端⼝资源;
3)是否服务端开启的端⼝数太少,不够⽤?
4)是否client要求的并发量太⼤?
这⼏点会导致服务器端⼝被占满,⽆空闲端⼝可⽤。我们client⾥都未指定特定端⼝,⽽且都⽤using{}包裹及时释放。但fig⾥keepAliveEnabled=true应该改为false,否则会持续占⽤端⼝。然后也可以调整服务端的资源上限,修改服务器配置,提升端⼝上限、降低超时时间,如下:打开regedit->到HKLM\system\CurrentControlSet\Services\Tcpip\Parameters,新增2项
漳州师范学院学报MaxUserPort=65534, TcpTimedWaitDelay=5,重启服务器即可。
9、IIS⾥某个应⽤程序池(⽐如: /LM/w3svc/3/root/Service)⾥的所有服务报OutOfMemoryException异常。
答:IIS在运⾏过程中,每⽉都会出2-3次内存不⾜的异常,在替换服务的dll后,也会出现这个异常。出错时能看到某个应⽤程序池占⽤
lan club1.8G以上的内存。可以⼿⼯强制回收对应的程序池,也可以设置内存超过1.5G时触发回收。当然,最重要的还是代码⾥尽量在DB端过滤数据,⽽不是取到内存⾥再计算。
10、1)某个service.dll应该有14M,但⽤vs2005⽣成出来只有372K,并且报⽣成成功。2)同⼀个⽂件,增长到16.5M时,报fatal error cs0013: 将元数据写⼊⽂件obj\debug\service.dll时发⽣错误。
答:1)的情况下,改⽤msbuild可以正确⽣成。2)的情况下,msbuild和csc也报同样的错误。并且xp/win7/server 03、
vs2005/vs2010下都稳定报错。分析下来,应该与项⽬⾥包含的字符串总长度有关系。因为去掉其中某⼀两个⽂件,⽣成能成功,甚⾄删除其中⼀部分代码或另⼀部分代码,也能成功。写了个测试项⽬试了下csproj⾥到底能包含多少字符串:
试下来,⽣成⼀个超⼤的test.cs⽂件,56个字符×130000时会报cs0013,14个字符×430000时也报cs0013。不过细节不同:fatal error cs0013: unexpected error writing metadata to file -- 没有剩余的逻辑空间来创建更多⽤户字符串。
虽然错误不完全⼀致,但猜测是项⽬⾥包含了太多的字符/变量/资源等,超出了某个限制,结论是只能拆分项⽬。
11、DataWindow下拉框⼀闪即逝,搜狗拼⾳4.3与dw不兼容
答:满⾜2个条件,会出现这⼀问题:1)⽤户把所有输⼊法全删了,只保留搜狗拼⾳输⼊法v4.3.0.33
15正式版;2)点击DataWindows 下拉框。
⼀般来说,点击不允许输⼊的控件时,输⼊法会⾃动关闭或切换到英⽂状态。尝试使⽤紫光拼⾳、微软拼⾳都正常,Dx下拉框也正常,搜狗v6.0.0.5972也正常。因此认定是搜狗v4.3的⼀个Bug。
12、远程服务器返回错误(400)错误的请求
分析:1)登录Client时调⽤GetMacIpInfo后客户端GetResponse时出错。
2)值得注意的是,直接⽤浏览器调⽤rest服务是OK的,⽽⽤代码访问会出错。
3)尝试⽤Reflector8对⽐正确、错误的dll,发现加密前的版本是正确的,加密后的版本出错。再进⼀步对⽐发现,正确的加密dll参数未被混淆,⽽错误的加密dll参数如下:public DataTable GetMacIpInfo(string 001llll1010, string 0l1000ll1, string 011010ll)
4)最终在使⽤MaxtoCode加密服务dll时,去掉参数混淆选项即可。
13、⽆法到字体Arial //未解决
在System.Drawing.FontFamily.CreateFontFamily(string name, FontCollection fontCollection)
在System.(string name)
分析:1)⽤户Client⾥的英⽂很⼩,中⽂显⽰正常。
2)奇怪的是,⽤户C:\windows\Fonts⾥已经有Arial字体了,安装对应字体、复制到Fonts⽬录后也⽆效。
3)在win7已安装的字体,有些并未显⽰,需要到Fonts⾥右键点击显⽰。xp⾥还需要对字体⽂件添加everyone读取+读取和运⾏权限。
14、Dx导出PDF时中⽂显⽰为乱码。
答:1)Dx默认字体是Tahoma,不⽀持中⽂,导出时可以改⽤Arial Unicode MS。
2)但有些机器没有预装Arial Unicode MS字体,打开导出的PDF时中⽂会显⽰为“This font is not yet supported”。⼿⼯安装即可。也可以使⽤⼀些更常见的字体,⽐如仿宋、楷体等。
3)当然,也可以在导出的时候,判断⽤户机器上是否存在某个字体,并把该字体嵌进去,保证在其他机器也能正常打开。
15、此IP Address(0.1.0.4)不能登录系统。
答:安装过摄像头、或者TV卡的机器上,会出现⼀个0.1.0.4的虚拟IP,拔出设备或者注销重启之后就没了。ipconfig⾥能看到:
Description:Microsoft TV/Video Connection
Physical Address:00-00-00-00-00-00
Autoconfiguration IP Address:0.1.0.4
Subnet Mask:255.255.255.255
需要在获取到的IP列表⾥过滤掉这种⽆效IP和IPv6的地址,或者针对内部应⽤,可以⽤正则表达式判断IP的有效性。
16、对于某些⼤事务长时间运⾏时,会由于事务超时引发异常:⽆效操作,连接被关闭。
答:这个问题详见:
17、双击ClickOnce更新程序时报“⽆法安装或运⾏此应⽤程序,该应⽤程序要求⾸先在全局程序集缓存gac中安装程序集
system.identityModel 3.0.0.0”
答:ClickOnce的错误可以先去事件管理器⾥看看,微软的程序⼀般出错了都会在事件->应⽤程序⾥留下出错信息。
1)对于这个错误,报dll在gac⾥不到,去c:\windows\assembly⾥确认⼀下,确实没有,也可以⽤gacutil确认。于是把好的机器上的c:\windows\assembly⽬录打包,⽤管理员权限覆盖上去,能更新了。//有点暴⼒
2)但更新的过程中报错:Faulting , faulting module mscorwks.dll, version 2.0.50727.3620 | runtime verison 2.0.50727.3620 - 执⾏引擎错误,好的机器上mscorwks.dll的版本是2.0.50727.3634,⽤管理员权限替换即可。估计是xp
sp3的补丁没打上。
18、ClickOnce Your web browser settings do not allow you to run unsigned applications.
答:IE⼯具->Internet选项->⾼级->安全选项卡->勾上“允许运⾏或安装软件,即使签名⽆效”
IE⼯具->Internet选项->安全->点击“可信站点”->点“站点”->去掉“对该区域中所有站点要求服务器验证(https)”->输⼊ClickOnce 所在站点->点击添加
19、NetUtil.GetMacAddresses出错,ManagementClass抛出ManagementException,3类异常分别是“不到”、“数据错误(循环冗余检查)。(异常来⾃HRESULT: 0x80070017)”、“拒绝访问。(异常来⾃HRESULT 0x80070005
E_ACCESSDENIED)”。
答:1)第⼀类异常not found,在,说wmi的repository运⾏的过程中可能出错,需要让它⾃⾏重建。对于xp sp2的机器,输⼊以下命令:rundll32 wbemupgd,UpgradeRepository。执⾏后在logs\setup.log⾥报错80041002,对象不到(不到类别、范例或属性)。8004100E,命名空间不到。再次尝试,在管理员命令⾏⾥,依次执⾏:net stop winmgmt->重命名
c:\windows\system32\wbem\Repository为Repo_bad之类的->net start winmgmt,这样wmi会⾃⾏重建。工程管理系统
2)第⼆类异常数据错误,看起来是⽂件CRC校验出错,使⽤chkdsk C: /R在下次重启时检查⽂件,或在重启后,使⽤安装盘⾥的磁盘检测⼯具把整个磁盘修复⼀下就OK了。
3)第三类拒绝访问,看起来是权限问题,对⽬录c:\windows\system32\wbem添加everyone的修改权限,重启后OK。
4)另外还提到⼀套,看起来很强⼤,还没试过。
20、client遇到问题需要关闭,我们对此引起的不便表⽰抱歉。
答:我们在Application.ThreadException和AppDomain.CurrentDomain.UnhandledException⾥抓了所有未处理的异常,但这个问题并没有被抓住,可以认为程序启动时加载依赖项就发⽣错误了,但这是事后才想到的。
1)⼀开始遇到这个问题的第⼀反应,是去事件管理器⾥看有⽆线索。但事件管理器⾥只有faulting , faulting module kernel32.dll, version 5.1.2600.5781, fault address 0x00012afb,事件ID=1000, ⽐较了⼀下⽤户和我机器上的
kernel32.dll、mscorlib.dll、mscorwks.dll这⼏个经典dll,替换了版本不同的,打开仍然出错。
2)后来⾛上了偏路,看到stackoverflow上⼀个帖⼦说可能资源被其他程序占⽤或泄漏了,觉得有点道理:some app is stealing some global resources as ou experience trouble with other applications. App like notepad do not use much resources so appear to work fine, heavy apps are more likely to show up the trouble。于是查看任务管理器,发现我xp上38955个handles,win7上75211个handles, 但⽤户机器上有259071个handles,把占⽤句柄最多的⼏个程序NTRtScan、VRVEDP_M、某个svcho
st,趋势杀毒等杀掉之后,仍然报相同的错误。后来我想到,如果是资源不够⽤,那多开⼏个word+excel+ps+foxit pdf+video,如果没问题,应该能去除这个可能性。
3)然后终于⾛上了正路,⽤sysinternals的ProcessExplorer⽣成的full dump⽂件,安装win7的symbols之后加载dump并分析,能得到⽐较详细的堆栈信息,能看到是在mscorwks获取元数据时出错然后调⽤kernel32抛异常的。
kernel32!RaiseException+0x52
mscorwks!GetMetaDataInternalInterface+0x84a9
mscorwks!CopyPDBs+0x39f8
mscorwks!LogHelp_LogAssert+0x5448
这⾥其实已经指向了真正的问题所在,是加载dll的元数据时出错,但是没指出真正出错的dll。
4)最后重启⽤管理员登录,再dump出⼀个full.dmp,这次⽤windbg⼀分析(analyze -v),居然⼀⽬了然的指出“未能加载
common.dll",⼀看⽤户机器上出错的dll只有260K,正常应该有3.25M,直接更新这个⽂件即可。奇怪的是⾥⾯明明是个net的异常System.BadImageFormatException,为什么没有以的异常抛出呢?呵呵
5)教训是1》这次⼜是由于dll更新不完整造成的,只是更加隐藏,更新⽂件的时候不加CRC或hash验证真不⾏啊。2》似乎⽤域⽤户权限dump出的信息不全,还是要⽤管理员权限⽣成full dump。3》windbg确实⽐较⽜,还是要认真学⼀学。
21、未能加载⽂件或程序集DataWindowInterop, Version=2.0.6662.0或它的某⼀个依赖项,试图加载格式不正确的程序
答:乍⼀看是个类似的问题,但更新这个dll仍然出错,猜测是环境和os的问题,换⼀台win2003的机器是OK的。后来注意到⽤户的系统是win7 x64位的,我们的依赖了DataWindowsInterop.dll。⽤Reflector打开client和dwi,都是any cpu的。右键->属性->兼容性->⽤xp sp3兼容模式运⾏,还是报同样的错误。再把client⽤x86⽣成,再跑就OK了。这似乎说明client是以x64运⾏的,并且希望到dwi的x64位版本,⽽标识为any cpu的DataWindowsInterop其实是x86的,并不⽀持x64,所以格式并不正确。解决:要么为⽤户⽣成⼀个dwi64位的版本,要么换⼀个32位的环境。

本文发布于:2023-07-05 18:11:20,感谢您对本站的认可!

本文链接:https://patent.en369.cn/xueshu/174533.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:问题   程序   权限
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 369专利查询检索平台 豫ICP备2021025688号-20 网站地图