如何解释这个堆栈跟踪
我最近发布了Windows Phone 8应用程序。 该应用程序有时似乎随机崩溃,但问题是它没有中断崩溃,我得到的唯一信息是输出的消息,告诉我有没有提供任何细节的访问冲突。 所以在发布之后,从崩溃报告中我可以获得更多的信息,但是对我来说这些信息还是有点隐晦的。
信息是:
Problem function: unknown //not very useful Exception type: c0000005 //this is the code for Access violation exception Stack trace: Frame Image Function Offset 0 qcdx9um8960 0x00035426 1 qcdx9um8960 0x000227e2
我不习惯使用内存指针和similia,我不习惯看到像这样的堆栈跟踪。
所以我有这样的问题:
- 我应该如何解读/阅读这些信息,每一条信息的含义是什么?
- 有没有一种方法来利用这些信息来针对我的search问题?
有没有办法在VS2012中debugging时获取这些信息?
笔记:
- 我不是问什么访问违规
- 我将其标记为c#和c ++,因为我的代码是在c#中,但通过c + +实现为WebBrowser组件生成exception(我半猜)
编辑:
我试着将Debugtypes设置为Native,这让我获得了我在开发中心崩溃报告中得到的相同信息。 通过这种方式,debugging程序在引发exception时中断,让我看到反汇编的代码,不幸的是没有qcdx9um8960 .pdb文件(即使在Microsoft Symbol Server上),所以我不知道导致错误的函数名称。
奇怪的是,在networking上search图像名称“qcdx9um8960”会返回几个引用Windows Phone 8和WebBrowser控件的结果。 收集答案和答复(有些甚至是由MSFT),这里是你应该研究的内容:
- 如果您将您的应用程序从Windows Phone 6/7升级到8,请确保您还没有引用任何6/7 DLL。 1
- 确保你没有在Debug模式下testing或发布你的软件。 有一个“qcdx9um8960.pdb”文件可能会丢失,导致访问冲突。 1
- “…如果应用程序有多个WebBrowser打开的副本,则可能存在竞态条件已知问题,请查看您的代码是否可能无意中创build了多个实例。 1
- 该图像“qcdx9um8960”引用了Qualcomm DirectX驱动程序DLL。 也许这不是WebBrowser组件的错,而是它可能用来渲染网页的DirectX驱动程序。 2
- 图像的名称表明,崩溃发生在由Qualcomm Snapdragon S4 Plus(型号为MSM8960)供电的设备上。 3
- 假设上面的处理器,并交叉引用使用该芯片的Windows手机,你可能会看到在诺基亚Lumia 920T上发生的问题。 3这并不是说驱动程序不能在几个处理器架构或手机上工作。
还有其他几个有关崩溃的问题,以及在该DLL出现的时候debugging的问题,所以不幸的是,对于你来说,我想你可能会受到一些第三方软件的束缚,这些软件有一些未解决的问题。
参考
自从更新至WP8以来, 1次 访问冲突
2 [Toolkit] [WP8] DepthStencilBuffer的性能问题
3 Snapdragon(片上系统)
这种崩溃“应该”永远不会由托pipe代码引起,所以你可以去寻找一个你的应用程序错误地调用某个系统或库API的情况。 这很乏味。 这个问题可能与您的应用程序无关,也可能完全在其他人的代码内部。 例如,当用户浏览某个恶意页面时,WebBrowser可能会崩溃。 或者失败的代码可能运行在永远不会运行代码的线程上。 从您的观察中可以看出,debugging器在访问冲突之前没有显示任何消息,并且调用堆栈上只有两个帧,我怀疑这很可能。
因此,您应该首先关注获得(相当)可靠的repro场景:将(通常或通常)产生崩溃的(最小)一组步骤。 这可能涉及访问遇到崩溃的用户,也可能是您的部分testing自动化尝试加速故障率。
一旦你有了这些,微软(或另一个第三方)将承担责任 – 托pipe的代码是不应该会导致一个未处理的exception,如访问冲突。 而且该场景可能会提示您如何更改应用的行为以避免该问题,因为真正的修复可能需要很长时间才能发布和分发。