Если у вас нет VS2010, вы можете использовать PostSharp для ткачества в коде для сбора параметров при вызове функций. Тем не менее, это замедлит код, поэтому полезно только для отладки.
EDIT: (содействие этому с комментарием я только что сделал)
Если вы хотите использовать это в производстве, вы можете либо ограничить сферу PostSharp ткачества, поэтому он работает только на определенных классах/пространствах имен/сборок (или даже функций), или вы можете ограничить то, что вы делаете, когда ваш совет будет выполнен. Одна вещь, которую я пробовал, но не полностью выполнил, заключалась в том, чтобы методы консультаций просто записывали информацию о кадре стека в кольцевом буфере. Когда возникает исключение, ваш регистратор может захватить информацию о кадре стека из кольцевого буфера и создать подходящее сообщение журнала. В противном случае информация о кадре просто перезаписывается по мере заполнения кольцевого буфера. Вы даже можете использовать стек вместо кольцевого буфера и увеличивать и сокращать этот стек, записывая информацию о кадре, поскольку стек вызовов растет и сжимается. Предостережение: вы не сможете получить информацию о кадре из кода рамки или стороннего кода, который не может быть изменен PostSharp.
Можете ли вы привести пример «не могу определить, где произошла ошибка»? Мне интересно, является ли ваша проблема плохой обработкой исключений (уничтожение трассировки стека вызовов), или просто вам нужна помощь в чтении стеков стека. –
Трассировка стека пока не показывает значение locals/parameters. afaik вы не можете сделать это через журнал выполнения - только путем взлома в отладчик (т. е. VS). однако он должен точно указать, где именно происходит исключение (по крайней мере, внешнее исключение). –
Плохая обработка исключений - это то, о чем я тоже думал. Я очень часто видел обработку исключений, например 'try {...} catch (Exception ex) {Log.Error (ex); бросить ex; } 'или даже просто' try {...} catch (Exception ex) {throw ex; } ', оба из которых выбрасывают трассировку стека в исключении, когда выполняется' throw ex''. Если исключение нужно перебросить, обычно лучше использовать 'throw;' как в 'try {...} catch (Exception ex) {Log.Error (ex); бросить; } 'или выбросить новое исключение с исходным исключением как внутреннее исключение. –