Как Проследить все локальные переменные, когда исключение происходит

Я создал рабочий пример с данными. Я верю, это определенно поможет вам. значения динамического поля вычисляются и результат отображается в конце.

  TYPES: BEGIN OF ty_itab,
         currency TYPE c,
         fieldk TYPE i,
         fieldt TYPE i,
         fieldh TYPE i,
       END OF ty_itab.
  TYPES: BEGIN OF ty_structure,
         fieldk TYPE i,
         fieldt TYPE i,
         fieldh TYPE i,
       END OF ty_structure.

DATA: itab   TYPE TABLE OF ty_itab,
      ls_structure TYPE ty_structure.

itab = VALUE #( ( currency = 'H' fieldk = 10 fieldt = 20 fieldh = 30 )
                ( currency = 'H' fieldk = 50 fieldt = 60 fieldh = 70 )
                ( currency = 'T' fieldk = 100 fieldt = 120 fieldh = 150 )
                ( currency = 'K' fieldk = 300 fieldt = 400 fieldh = 500 )  ).

LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).
  CASE <fs>-currency.
    WHEN 'K'. ADD <fs>-fieldk TO ls_structure-fieldk.
    WHEN 'T'. ADD <fs>-fieldt TO ls_structure-fieldt.
    WHEN 'H'. ADD <fs>-fieldh TO ls_structure-fieldh.
  ENDCASE.
ENDLOOP.

cl_demo_output=>display( ls_structure ).
12
задан usman shaheen 12 December 2008 в 10:51
поделиться

4 ответа

Ответ: Используя PostSharp (Инжекция политики), атрибут XTraceMethodBoundary, OnException. переопределения это регистрирует весь вход метода и типы возвращаемых параметров и значения. Я изменил PostSharp для добавления простого метода зарегистрировать параметры. не прекрасный, но достаточно хороший

private static void TraceMethodArguments(MethodExecutionEventArgs eventArgs)
{
    object[] parameters = eventArgs.GetReadOnlyArgumentArray();

    if (parameters != null)
    {
        string paramValue = null;
        foreach (object p in parameters)
        {
            Type _type = p.GetType();
            if (_type == typeof(string) || _type == typeof(int) || _type == typeof(double) || _type == typeof(decimal))
            {
                paramValue = (string)p;
            }
            else if (_type == typeof(XmlDocument))
            {
                paramValue = ((XmlDocument)p).OuterXml;
            }
            else
            { //try to serialize
                try
                {
                    XmlSerializer _serializer = new XmlSerializer(p.GetType());
                    StringWriter _strWriter = new StringWriter();

                    _serializer.Serialize(_strWriter, p);
                    paramValue = _strWriter.ToString();
                }
                catch
                {
                    paramValue = "Unable to Serialize Parameter";
                }
            }
            Trace.TraceInformation("[" + Process.GetCurrentProcess().Id + "-" + Thread.CurrentThread.ManagedThreadId.ToString() + "]" + " Parameter: " + paramValue);
        }
    }
}
9
ответ дан 2 December 2019 в 06:46
поделиться

Используйте MiniDumpWriteDump для создания дампа памяти процесса при исключении. У Вас был бы к P/Invoke он.

2
ответ дан 2 December 2019 в 06:46
поделиться

Вы могли сделать дамп памяти процесса, так как это получает и "кучу" и стеки, но так как Вы отметили вопрос как вход, я предполагаю, что это не то, что Вы ищете.

Однако можно уменьшить потребность в этой информации путем проверки, что методы являются всегда маленькими и к точке. Это приведет к намного более полезным отслеживаниям стека, и это ограничит число местных жителей для осмотра.

4
ответ дан 2 December 2019 в 06:46
поделиться

Вы не можете в основном. Отражение позволяет Вам достигнуть экземпляр (и статичный) переменные, но если Вы хотите зарегистрировать локальные переменные, необходимо будет сделать так явно. Возможно, что Вы могли сделать немного лучшее использование профильного API, но это будет довольно экстремальным шагом.

8
ответ дан 2 December 2019 в 06:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: