由于访问System.ArgumentOutOfRangeException
中的项目所用的索引错误而引发了DataGrid
(发生在出厂版本中,没有进行用户交互)。
以下是我们收到的堆栈跟踪的一部分:
System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values.
Parameter name: index
at System.Windows.Media.VisualCollection.get_Item(Int32 index)
at System.Windows.Controls.UIElementCollection.get_Item(Int32 index)
at System.Windows.Controls.UIElementCollection.System.Collections.IList.get_Item(Int32 index)
at System.Windows.Controls.DataGridCellsPanel.ArrangeOverride(Size arrangeSize)
at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
at System.Windows.UIElement.Arrange(Rect finalRect)
at MS.Internal.Helper.ArrangeElementWithSingleChild(UIElement element, Size arrangeSize)
at System.Windows.Controls.ItemsPresenter.ArrangeOverride(Size arrangeSize)
at System.Windows.FrameworkElement.ArrangeCore(Rect finalRect)
[...]
在堆栈跟踪的更下方,我们还可以看到在引发异常的DataGrid
上虚拟化处于活动状态。该错误很可能与延迟加载/虚拟化有关,但是,发生的地方仍然是个谜。
是否可以配置WPF或手动添加信息以跟踪引发异常的位置? (至少是哪个类/控件/页面/窗口,甚至可能是哪个绑定)
答案 0 :(得分:1)
我怀疑您最好的选择是进行内存转储以诊断问题。如何获得一个,取决于如何设置异常处理代码。
如果您的应用程序自行处理异常(并且不会崩溃),则将很难生成转储。您可以尝试此处概述的方法:Generating .NET crash dumps automatically。或者,如果在引发异常时使应用程序保持活动状态(带有对话框或类似内容),则可以要求用户获取内存转储以进行进一步分析(通过任务管理器=>右键单击进程=>创建转储)
如果应用程序实际崩溃,则可以自动创建转储文件,但是需要在注册表中对其进行配置(请参见https://blogs.msdn.microsoft.com/tess/2010/08/23/getting-full-user-mode-dumps-automatically-when-your-process-crashes/,https://www.meziantou.net/2018/06/04/tip-automatically-create-a-crash-dump-file-on-error)。
答案 1 :(得分:0)
我在App.xaml.cs文件中做了如下操作
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
static string filePath = System.IO.Path.Combine(Environment.GetFolderPath(
Environment.SpecialFolder.ApplicationData), "Log.txt");
private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
using (StreamWriter writer = new StreamWriter(filePath, true))
{
writer.WriteLine("Message :" + e.Exception.Message + "<br/>" + Environment.NewLine + "StackTrace :" + e.Exception.StackTrace + "" + Environment.NewLine + "Date :" + Now.ToString());
writer.WriteLine(Environment.NewLine + "-----------------------------------------------------------------------------" + Environment.NewLine);
}
MessageBox.Show("An unhandled exception just occurred: " + e.Exception.Message, "Exception", MessageBoxButton.OK, MessageBoxImage.Warning);
e.Handled = true;
}
}
希望对您有帮助