Si vous ne disposez pas de VS2010, vous pouvez utiliser PostSharp pour intégrer du code afin de collecter des paramètres lorsque des fonctions sont appelées. Il va ralentir le code, donc c'est seulement utile pour le débogage.
EDIT: (la promotion de ce à partir d'un commentaire que je viens de faire)
Si vous voulez utiliser dans la production, vous pouvez limiter la portée du tissage PostSharp, il ne fonctionne que sur certaines classes/namespaces/assemblées (ou même des fonctions), ou vous pouvez limiter ce que vous faites lorsque votre conseil est exécuté. Une chose que j'ai essayée, mais que je n'ai pas complètement suivie, était que les méthodes de conseil enregistraient simplement les informations de trame de pile dans un tampon circulaire. Lorsqu'une exception se produit, votre enregistreur peut récupérer les informations de la pile à partir du tampon circulaire et générer un message de journal approprié. Sinon, les informations de trame sont simplement écrasées lorsque le tampon circulaire se remplit. Vous pouvez même simplement utiliser une pile au lieu d'un tampon circulaire et faire en sorte que cette pile croisse et se rétrécisse, en enregistrant les informations sur l'image, à mesure que la pile d'appels s'agrandit et se rétracte. Avertissement: vous ne serez pas en mesure d'obtenir des informations sur le cadre à partir d'un code d'infrastructure ou d'un code tiers qui ne peut pas être modifié par PostSharp.
Pouvez-vous donner un exemple de "ne peut pas dire où l'erreur s'est produite"? Je me demande si votre problème est une mauvaise gestion des exceptions (détruisant la trace de la pile des appels), ou si vous avez juste besoin d'aide pour lire les traces de la pile. –
La trace de la pile ne montre malheureusement pas la valeur des variables locales/paramètres. afaik vous ne pouvez pas le faire via la journalisation de l'exécution - uniquement en entrant par effraction dans un débogueur (c'est-à-dire VS). Cependant, il devrait vous dire exactement où l'exception se produit (l'exception extérieure au moins). –
Mauvaise gestion des exceptions est ce que je pensais aussi. J'ai très souvent vu la gestion des exceptions comme 'try {...} catch (Exception ex) {Log.Error (ex); jeter ex; } 'ou même simplement' try {...} catch (Exception ex) {throw ex; } ', les deux jettent la trace de la pile dans l'exception quand' throw ex; 'est exécuté. Si une exception doit être relancée, il est généralement préférable d'utiliser 'throw;' comme dans 'try {...} catch (Exception ex) {Log.Error (ex); jeter; } 'ou pour lancer une nouvelle exception avec l'exception d'origine comme exception interne. –