public void setCrashReport(CrashReport crashReport) {
    stackTraceView.populateFromCrashReport(crashReport);
    termTreeView.populateFromTerm(crashReport.getProps());

    Object[][] crashProps = {
      {"Pid", crashReport.getPid()},
      {"Reg. Name", crashReport.getRegisteredName()},
      {
        "Error",
        ErlyBerly.getTermFormatter()
            .exceptionToString(crashReport.getErrorClass(), crashReport.getErrorReason())
      },
      {
        "Initial Call",
        ErlyBerly.getTermFormatter()
            .modFuncArgsToString((OtpErlangTuple) crashReport.getProcessInitialCall())
      }
    };

    TableColumn<Object[], Object> keyColumn = new TableColumn<>("Key");
    TableColumn<Object[], Object> valueColumn = new TableColumn<>("Value");

    keyColumn.setCellValueFactory(
        new Callback<CellDataFeatures<Object[], Object>, ObservableValue<Object>>() {
          @Override
          public ObservableValue<Object> call(CellDataFeatures<Object[], Object> p) {
            return new SimpleObjectProperty<>((p.getValue()[0]));
          }
        });

    valueColumn.setCellValueFactory(
        new Callback<CellDataFeatures<Object[], Object>, ObservableValue<Object>>() {
          @Override
          public ObservableValue<Object> call(CellDataFeatures<Object[], Object> p) {
            return new SimpleObjectProperty<>((p.getValue()[1]));
          }
        });

    crashInfoTable.getColumns().add(keyColumn);
    crashInfoTable.getColumns().add(valueColumn);

    crashInfoTable.getItems().addAll(crashProps);

    crashReport
        .getCallArgs()
        .ifPresent(
            (callArgs) -> {
              argsTreeView.populateFromListContents(callArgs);
            });
  }