赞
踩
看到如此强硬的走势,谁还敢说微软不行了呢?
不过,最近在给一家很有影响力的公司做Windows平台开发的培训时,课堂上使用微软的VS 2019做试验,有同行报告了一个让人有点难以相信的问题。特撰文与大家分享。
相信这个公众号的大多数读者都知道VS为何物,是的,就是著名的Visual Studio,简称VS。
这个问题是什么呢?如果你有VS 2019,那么可以按下面的步骤试一下:
1. 创建一个Windows桌面应用程序(C/C++语言)
2. 切换到资源视图,选择菜单
3. 像下图那样,随便选择一个菜单项,右键调出属性编辑界面,然后随便改动以下菜单的Caption内容,按回车提交改动
于是,至少在笔者调查过的很多个系统中,难以置信的事情就发生了, VS 2019崩溃了!
如果第一次没有看清,那么重复一遍,只要三步,就又出现了。是的只要三步,就把软件帝国的一个旗舰性的产品挑落于马下!而且死的如此难看,直接崩溃。
“我的天哪,太让人跌掉眼镜了。”一位格友如此大呼!
是啊,老雷分析过很多微软的BUG,但是大多都还是有些技术含量的,要比较复杂的过程才能触发,而且常常是随机出现的。
如此直接,如此必现,如此明目张胆,真的还是第一次。
要知道,软件帝国的称号不是随便来的,微软的产品质量是靠着很多技术和非技术的手段保证着的,比如很高配比的测试设计工程师,注意啊,叫测试设计工程师,不是简单的测试工程师。微软的测试设计工程师都是能写代码的,可以做白盒测试的。
除了自己的测试设计工程师外,微软还有数量非常庞大的外包团队帮助测试,笔者曾经参观过在xx的测试基地,好大的阵容,....
上调试器吧!
在管理员窗口中,WinDBG -I,启用及时调试,再重复上面的三步,VS 2019应声中断到WinDBG。
天啊,居然是空指针,又是如此的天真无邪!
而且就发生在0号线程。
(4e1c.1590): Access violation - code c0000005 (!!! second chance !!!)
*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4.0.30319_32\System.Windows.Forms\417f46e3fc84eed07937ec063626f555\System.Windows.Forms.ni.dll
eax=00000000 ebx=0000000d ecx=00000000 edx=00000005 esi=174b5e04 edi=174b5e04
eip=7b1a3ea3 esp=0059f044 ebp=0059f04c iopl=0 nv up ei pl nz ac po cy
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00210213
System_Windows_Forms_ni+0xa93ea3:
7b1a3ea3 8b01 mov eax,dword ptr [ecx] ds:002b:00000000=????????
访问ECX所代表的指针,但是ECX为0,太残酷了。
怎么会这样呢?
从模块名来看,是托管模块的问题。糟糕的.Net啊,是你的错么?
继续请调试工具:.loadby sos clr
呼唤出sos,son of strike!
使用ip2md找到出问题的方法。
0:000> !ip2md @eip
MethodDesc: 7a844330
Method Name: System.Windows.Forms.PropertyGridInternal.PropertyGridView+GridViewEdit.ProcessDialogKey(System.Windows.Forms.Keys)
Class: 7a7972b8
MethodTable: 7b2cf01c
mdToken: 06006f00
Module: 7a711000
IsJitted: yes
CodeAddr: 7b1a3e34
Transparency: Safe critical
看上面的类型名:PropertyGridView+GridViewEdit,这个加号有点让人匪夷所思。
从模块名来看,这是一个预编译的模块,详细观察版本信息:
0:000> lm vm System_Windows_Forms_ni
Browse full module list
start end module name
7a710000 7b576000 System_Windows_Forms_ni C (pdb symbols) c:\symbols\System.Windows.Forms.pdb\B65DD5BADDB440169C4A9A9A5E1CAD3B1\System.Windows.Forms.pdb
Loaded symbol image file: C:\Windows\assembly\NativeImages_v4.0.30319_32\System.Windows.Forms\417f46e3fc84eed07937ec063626f555\System.Windows.Forms.ni.dll
Image path: C:\Windows\assembly\NativeImages_v4.0.30319_32\System.Windows.Forms\417f46e3fc84eed07937ec063626f555\System.Windows.Forms.ni.dll
Image name: System.Windows.Forms.ni.dll
Browse all global symbols functions data
Has CLR image header, track-debug-data flag not set
Timestamp: Thu Jul 25 09:09:51 2019 (5D39015F)
CheckSum: 00000000
ImageSize: 00E66000
File version: 4.8.3928.0
Product version: 4.0.30319.0
File flags: 8 (Mask 3F) Private
File OS: 4 Unknown Win32
File type: 2.0 Dll
File date: 00000000.00000000
Translations: 0409.04b0
CompanyName: Microsoft Corporation
ProductName: Microsoft® .NET Framework
InternalName: System.Windows.Forms.dll
OriginalFilename: System.Windows.Forms.dll
ProductVersion: 4.8.3928.0
FileVersion: 4.8.3928.0 built by: NET48REL1
PrivateBuild: DDBLD495
FileDescription: .NET Framework
LegalCopyright: © Microsoft Corporation. All rights reserved.
Comments: Flavor=Retail
真正的版本信息是4.8.3928.0,不要被目录名骗了。
观察栈回溯和栈上的对象(dso)。
从栈上对象来看,ESI和EDI指向了同一个对象...
(未完待续,希望能够重现此问题的朋友留言,顺便提醒,希望报名庐山研习班的格友,优惠期即将结束,2019年压轴一讲,详情请见http://001001.org/gedu/)
***********************************************************
正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生
欢迎访问http://001001.org/gedu/了解软件调试高级研习班的最新信息
或者关注格友公众号
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。