我最近发布了一款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
Run Code Online (Sandbox Code Playgroud)
我不习惯使用内存指针和similia,我不习惯看到像这样的堆栈跟踪.
所以我有这样的问题:
笔记:
编辑:
我尝试将Debug类型设置为Native,这让我获得了与开发中心崩溃报告中相同的信息.这种方式调试器在抛出异常时中断并让我看到反汇编的代码,遗憾的是没有qcdx9um8960 .pdb文件(即使在Microsoft Symbol Server上),所以我不知道导致错误的函数名称.
我有一个IAnimation暴露方法的接口BeginAsync().该方法应该启动动画并在完成时返回.
我想要做的是实现一个只在执行时返回的null动画类.NoAnimationBeginAsync()
这是正确的实施吗?
public async Task BeginAsync()
{
await Task.Run(() => { });
}
Run Code Online (Sandbox Code Playgroud)
我怀疑有一种比这更优雅的方法.我还考虑过创建一个空方法.但这给了我一个我不喜欢的警告.
使用保护子句防止异常或捕获异常是否更好?有最好的做法吗?这两种方法的利弊是什么?
例如,这更好:
try
{
param=myArray[3];
}
catch (IndexOutOfRangeException e)
{
do something...
}
Run Code Online (Sandbox Code Playgroud)
或这个:
if(myArray.Length < 4)
{
do something...
}
else
{
param=myArray[3];
}
Run Code Online (Sandbox Code Playgroud)
谢谢大家的答案:)
我正在为Windows Phone 8开发应用程序,我遇到了内存泄漏问题.但首先是一些背景.该应用程序(不幸的是)使用WebBrowsers作为页面.这些页面非常复杂,涉及很多javascript.
应用程序的本机部分用c#编写,负责与javascript进行一些简单的通信(例如,native是javascript与服务器通信的委托),为页面转换,跟踪,持久性等制作动画.是在一个独特的PhoneApplicationPage中完成的.
在我因内存不足异常而崩溃之后,我开始分析应用程序.我可以看到WebBrowsers,它是应用程序的重要组成部分,正在正确处理.但我看到的问题是内存不断增加.更糟糕的是,我对分析器的反馈很少.根据我的理解,分析器图表说存在一个大问题,而分析器数据表明根本没有问题......
注意:该步骤表示从WebBrowser到另一个WebBrowser的导航.通过两个控件之间的动画创建(我猜)尖峰.在我在图像中选择的范围中,我正在向前导航,一个向后进行最多5个WebBrowsers(2个用于总是存在的菜单,1个用于索引页,1个用于我导航的页面和1个对于我导航到的页面).在每个导航中,探查器显示正确数量的WebBrowsers:向前导航后为5,向后导航后为4.
注2:我添加了红线,以便更清楚地知道内存在那段时间内会上升
从图像中可以看出
内存使用量相当大,但数字表示它很低,在这段时间内,保留分配低于启动时...
我希望我已经包含了足够的信息.我想知道可能导致这个问题的一些想法.我到目前为止的想法是:
- WebBrowser中的javascript做错了(例如没有清理一些事件处理程序).即使是这种情况,WebBrowser也不应该在销毁时释放内存吗?
- 使用一个独特的PhoneApplicationPage是不应该做的邪恶,改变它的结构可能会导致这种情况.
-其他?
另一个问题:为什么图表显示正确的内存使用量而数字没有?
如果您需要有关探查器的更多信息,请询问,我将在明天发布.
假设我有一个一次性对象MyDisposable,它将另一个一次性对象作为构造函数参数.
using(MyDisposable myDisposable= new MyDisposable(new AnotherDisposable()))
{
//whatever
}
Run Code Online (Sandbox Code Playgroud)
假设myDisposable不处理它AnotherDisposable内部的处理方法.
这只能正确处理myDisposable吗?还是处理它AnotherDisposable?
我在c#中创建了一个简单的代码片段,用于添加该行
Debug.WriteLine("");
Run Code Online (Sandbox Code Playgroud)
现在,当您使用代码段时,下一步将是自动创建
using System.Diagnostic;
Run Code Online (Sandbox Code Playgroud)
有没有办法自动创建引用?我尝试以这种方式设置片段参考和导入元素:
<Snippet>
<References>
<Reference>
<Assembly>System.dll</Assembly>
</Reference>
</References>
<Imports>
<Import>
<Namespace>System.Diagnostic</Namespace>
</Import>
</Imports>
.
.
.
</Snippet>
Run Code Online (Sandbox Code Playgroud)
但它不起作用
c# ×6
.net ×1
async-await ×1
asynchronous ×1
c++ ×1
exception ×1
idisposable ×1
java ×1
memory ×1
task ×1
using ×1
xaml ×1