VS2019 windows桌面应用_图说VS2019的一个必现崩溃

前几天在格友会群里聊起微软,很多人都被它这几年的强势表现所折服。看一眼最近5年它的股票走势吧,从50以下一路攀升到快150了。

3a34fc9d5d11c84a3047b258f964059a.png

    看到如此强硬的走势,谁还敢说微软不行了呢?

    不过,最近在给一家很有影响力的公司做Windows平台开发的培训时,课堂上使用微软的VS 2019做试验,有同行报告了一个让人有点难以相信的问题。特撰文与大家分享。

    相信这个公众号的大多数读者都知道VS为何物,是的,就是著名的Visual Studio,简称VS。

    这个问题是什么呢?如果你有VS 2019,那么可以按下面的步骤试一下:

    1. 创建一个Windows桌面应用程序(C/C++语言)

    2. 切换到资源视图,选择菜单

    3. 像下图那样,随便选择一个菜单项,右键调出属性编辑界面,然后随便改动以下菜单的Caption内容,按回车提交改动

17fa8396961a89f5a729755c13a9b8ca.png

   于是,至少在笔者调查过的很多个系统中,难以置信的事情就发生了, VS 2019崩溃了! 

    如果第一次没有看清,那么重复一遍,只要三步,就又出现了。是的只要三步,就把软件帝国的一个旗舰性的产品挑落于马下!而且死的如此难看,直接崩溃。

    “我的天哪,太让人跌掉眼镜了。”一位格友如此大呼!

    是啊,老雷分析过很多微软的BUG,但是大多都还是有些技术含量的,要比较复杂的过程才能触发,而且常常是随机出现的。

    如此直接,如此必现,如此明目张胆,真的还是第一次。

    要知道,软件帝国的称号不是随便来的,微软的产品质量是靠着很多技术和非技术的手段保证着的,比如很高配比的测试设计工程师,注意啊,叫测试设计工程师,不是简单的测试工程师。微软的测试设计工程师都是能写代码的,可以做白盒测试的。

    除了自己的测试设计工程师外,微软还有数量非常庞大的外包团队帮助测试,笔者曾经参观过在xx的测试基地,好大的阵容,....

    上调试器吧!

    在管理员窗口中,WinDBG -I,启用及时调试,再重复上面的三步,VS 2019应声中断到WinDBG。

72817b538189fdc1fd43e4ce2a8ca454.png

    天啊,居然是空指针,又是如此的天真无邪!

    而且就发生在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)。

607cf38bbd57877404f86dd2a29bcf27.png

    从栈上对象来看,ESI和EDI指向了同一个对象... 

    (未完待续,希望能够重现此问题的朋友留言,顺便提醒,希望报名庐山研习班的格友,优惠期即将结束,2019年压轴一讲,详情请见http://001001.org/gedu/)   

***********************************************************

正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生

欢迎访问http://001001.org/gedu/了解软件调试高级研习班的最新信息

或者关注格友公众号

54d8db52f387aab195cf3f8fd3249ed6.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值