Воссоздать отслеживание стека с номерами строки из пользовательского отчета об ошибках в .NET?

Не тестировалось, но вместо воспроизведения аудиофайла и проверки баланса он мог бы прослушивать микрофон, извлекать фоновый шум и вычислять его «цвет» (частотный график). Если IPad Mini имеет модель микрофона, отличную от IPad 2, тогда цвет их фона должен быть заметно отличаться, и некоторые методы аудиосъемки могут помочь вам определить, какое устройство используется.

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

16
задан arbiter 29 June 2009 в 18:06
поделиться

4 ответа

Вы можете получить смещение последней инструкции MSIL из исключения, используя System.Diagnostics.StackTrace:

// Using System.Diagnostics
static void Main(string[] args)
{
    try { ThrowError(); }
    catch (Exception e)
    {
        StackTrace st = new System.Diagnostics.StackTrace(e);
        string stackTrace = "";
        foreach (StackFrame frame in st.GetFrames())
        {
            stackTrace = "at " + frame.GetMethod().Module.Name + "." + 
                frame.GetMethod().ReflectedType.Name + "." 
                + frame.GetMethod().Name 
                + "  (IL offset: 0x" + frame.GetILOffset().ToString("x") + ")\n" + stackTrace;
        }
        Console.Write(stackTrace);
        Console.WriteLine("Message: " + e.Message);
    }
    Console.ReadLine();
}

static void ThrowError()
{
    DateTime myDateTime = new DateTime();
    myDateTime = new DateTime(2000, 5555555, 1); // won't work
    Console.WriteLine(myDateTime.ToString());
}

Вывод:

в ConsoleApplicationN.exe.Program.Main (смещение IL: 0x7)
в ConsoleApplicationN.exe.Program.ThrowError (смещение IL: 0x1b)
в mscorlib.dll.DateTime..ctor (смещение IL: 0x9)
в mscorlib.dll.DateTime.DateToTicks (смещение IL: 0x61)
Сообщение: параметры года, месяца и дня описывают непредставимое значение DateTime.

Затем вы можете использовать Reflector или ILSpy для интерпретации смещения:

.method private hidebysig static void ThrowError() cil managed
{
    .maxstack 4
    .locals init (
        [0] valuetype [mscorlib]System.DateTime myDateTime)
    L_0000: nop 
    L_0001: ldloca.s myDateTime
    L_0003: initobj [mscorlib]System.DateTime
    L_0009: ldloca.s myDateTime
    L_000b: ldc.i4 0x7d0
    L_0010: ldc.i4 0x54c563
    L_0015: ldc.i4.1 
    L_0016: call instance void [mscorlib]System.DateTime::.ctor(int32, int32, int32)
    L_001b: nop 
    L_001c: ldloca.s myDateTime
    L_001e: constrained [mscorlib]System.DateTime
    L_0024: callvirt instance string [mscorlib]System.Object::ToString()
    L_0029: call void [mscorlib]System.Console::WriteLine(string)
    L_002e: nop 
    L_002f: ret 
}

Вы знаете, что инструкция перед 0x1b вызвала исключение. Для этого легко найти код C #:

 myDateTime = new DateTime(2000, 5555555, 1);

Вы можете сопоставить код IL со своим кодом C # сейчас, но я думаю, что выигрыш будет слишком маленьким, а усилия будут слишком большими (хотя может быть плагин отражателя). Вы должны быть в порядке со смещением IL.

15
ответ дан 30 November 2019 в 21:54
поделиться

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

2
ответ дан 30 November 2019 в 21:54
поделиться

Вы должны использовать Environment.FailFast , вызвать FailFast в Application.UnhandledException , и файл дампа будет создан для вас.

From MSDN:

Метод FailFast записывает запись в журнал в журнал событий приложения Windows используя параметр сообщения, создает дамп вашего приложения, а затем завершает текущий процесс.

Используйте метод FailFast вместо Метод выхода для прекращения вашего приложение, если состояние вашего приложение повреждено и не подлежит ремонту, и выполнение вашего приложения блоки try-finally и финализаторы будут испорченные программные ресурсы. В FailFast завершает текущий обрабатывает и выполняет любые Объекты CriticalFinalizerObject, но не выполняет никаких активных try-finally блоки или финализаторы.

Вы можете написать простое приложение, которое будет собирать файлы журнала и отправлять их вам.

Теперь открыть файл дампа немного сложно, Visual Studio не может обрабатывать управляемый файл дампа ( исправлено в .NET 4.0) можно использовать WinDBG , но необходимо использовать SOS .

5
ответ дан 30 November 2019 в 21:54
поделиться

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

Microsoft Symbol Server проиндексирует символы отладки и сохранит их для использования позже, когда у вас будет аварийный дамп, например, и нужны символы. Вы можете указать Visual Studio или Windbg на свой собственный экземпляр сервера символов, точно так же, как Microsoft , и он извлечет символы, необходимые для отладки этой версии вашего приложения (при условии, что вы проиндексировали символы с помощью сервера символов. перед отправкой).

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

Вот здесь и появляется Исходный сервер Microsoft . Точно так же, как сервер символов индексирует символы , исходный сервер проиндексирует источник , чтобы убедиться, что у вас есть соответствующая версия исходного кода, относящаяся к сборке программного обеспечения.

Рабочие версии Контроль версий , Symbol Server и Исходный сервер должен быть частью вашей стратегии управления конфигурацией программного обеспечения.

Существуют сторонние инструменты, некоторые из которых являются коммерческими, которые предоставят вам API для создания снимков состояния приложений, но, как вы уже понимаете, вам нужен механизм для загрузки этих снимков каким-либо образом в вашу среду.

Джон Роббинс на Файлы PDB

Джон Роббинс на Исходном сервере

Ознакомьтесь с документацией WinDbg по запуску и запуску Symbol Server.

Рабочие версии Контроль версий , Сервер символов и Исходный сервер должны быть частью стратегии управления конфигурацией программного обеспечения.

Существуют сторонние инструменты, некоторые из которых являются коммерческими, которые предоставят вам API для создания снимков состояния приложений, но, как вы уже понимаете, вам нужен механизм для загрузки этих снимков каким-либо образом в вашу среду.

Джон Роббинс на Файлы PDB

Джон Роббинс на Исходном сервере

Ознакомьтесь с документацией WinDbg по запуску и запуску Symbol Server.

Рабочие версии контроля версий , Symbol Server и Source Server должны быть частью вашей стратегии управления конфигурацией программного обеспечения.

Существуют сторонние инструменты, некоторые из которых являются коммерческими, которые предоставят вам API для создания снимков состояния приложений, но, как вы уже понимаете, вам нужен механизм для загрузки этих снимков в вашу среду каким-либо образом.

Джон Роббинс на Файлы PDB

Джон Роббинс на Исходном сервере

Ознакомьтесь с документацией WinDbg по запуску и запуску Symbol Server.

1
ответ дан 30 November 2019 в 21:54
поделиться
Другие вопросы по тегам:

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