查找抛出WPF异常的类/行号

时间:2018-08-03 06:28:53

标签: c# wpf exception exception-handling

由于访问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或手动添加信息以跟踪引发异常的位置? (至少是哪个类/控件/页面/窗口,甚至可能是哪个绑定)

2 个答案:

答案 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;
    }
}

希望对您有帮助