2010-08-19 3 views
1

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

Возможно ли установить процедуру, которая собирает, возможно, через отражение, параметры, локальные переменные и т. Д. В момент возникновения ошибки?

+0

Можете ли вы привести пример «не могу определить, где произошла ошибка»? Мне интересно, является ли ваша проблема плохой обработкой исключений (уничтожение трассировки стека вызовов), или просто вам нужна помощь в чтении стеков стека. –

+0

Трассировка стека пока не показывает значение locals/parameters. afaik вы не можете сделать это через журнал выполнения - только путем взлома в отладчик (т. е. VS). однако он должен точно указать, где именно происходит исключение (по крайней мере, внешнее исключение). –

+0

Плохая обработка исключений - это то, о чем я тоже думал. Я очень часто видел обработку исключений, например 'try {...} catch (Exception ex) {Log.Error (ex); бросить ex; } 'или даже просто' try {...} catch (Exception ex) {throw ex; } ', оба из которых выбрасывают трассировку стека в исключении, когда выполняется' throw ex''. Если исключение нужно перебросить, обычно лучше использовать 'throw;' как в 'try {...} catch (Exception ex) {Log.Error (ex); бросить; } 'или выбросить новое исключение с исходным исключением как внутреннее исключение. –

ответ

2

Если у вас нет VS2010, вы можете использовать PostSharp для ткачества в коде для сбора параметров при вызове функций. Тем не менее, это замедлит код, поэтому полезно только для отладки.

EDIT: (содействие этому с комментарием я только что сделал)

Если вы хотите использовать это в производстве, вы можете либо ограничить сферу PostSharp ткачества, поэтому он работает только на определенных классах/пространствах имен/сборок (или даже функций), или вы можете ограничить то, что вы делаете, когда ваш совет будет выполнен. Одна вещь, которую я пробовал, но не полностью выполнил, заключалась в том, чтобы методы консультаций просто записывали информацию о кадре стека в кольцевом буфере. Когда возникает исключение, ваш регистратор может захватить информацию о кадре стека из кольцевого буфера и создать подходящее сообщение журнала. В противном случае информация о кадре просто перезаписывается по мере заполнения кольцевого буфера. Вы даже можете использовать стек вместо кольцевого буфера и увеличивать и сокращать этот стек, записывая информацию о кадре, поскольку стек вызовов растет и сжимается. Предостережение: вы не сможете получить информацию о кадре из кода рамки или стороннего кода, который не может быть изменен PostSharp.

+0

PostSharp - это хороший способ включить ведение журнала трассировки для целей отладки, но это может определенно генерировать _lot_ шума, если не использовать осторожно. Я видел приложения в производстве, которые генерируют 100 МБ журнальных файлов каждый день. Это ценные данные, если у вас есть дисковое пространство, вы можете терпеть поражение производительности и иметь соответствующие инструменты для анализа/фильтрации журналов, чтобы вы могли их понять. –

1

Если вы можете перейти на VS2010, вы можете попробовать использовать функцию IntelliTrace, которая выполняет именно это.

+1

Возможно, вам понадобится выпустить второй ипотечный кредит для оплаты лицензии Ultimate. :) –

+0

Я имел в виду, когда я развертываю приложение в производство, а не во время разработки. – AngryHacker

+0

Прежде всего, у вас не должно быть таких проблем в производстве. Проведите лучшее тестирование и сначала попробуйте их в Тесте. Во-вторых, я не уверен, но возможно, что некоторые из них могут быть доступны в производстве. Я был бы удивлен, если сборщики данных действительно должны быть запущены из визуальной студии. –

Смежные вопросы