Я думаю, что единственный способ получить эту информацию в .NET - использовать отладчик.
В противном случае вам придется самостоятельно разработать решение для сохранения состояния стекового фрейма и иметь специальный способ регистрации исключений. В основном вы будете делать то же, что и профилировщик памяти, отслеживая созданные экземпляры. Это может привести к значительному снижению производительности, если вы не ограничите объем регистрируемой информации.
Лучшим решением было бы использовать возможности Trace и Assert в пространстве имен System.Diagnostics для выборочного отслеживания состояния программы или использовать средство ведения журнала (log4net, EnterpriseLibrary, NLog, свернуть свой собственный простой) для выгрузки потока / стек / переменная информация, как вы идете.
В любом случае добавление всей этой дополнительной информации - это большие затраты.
РЕДАКТИРОВАТЬ: я получил новости об этом проекте в моей ленте: NTrace . Похоже, это будет соответствовать немного больше того, что вы пытаетесь сделать.