查看所有函数调用和参数
本文关键字:参数 函数调用 | 更新日期: 2023-09-27 17:53:55
我继承了一个相当大的项目,使用了nhibernate/castle Windsor、wcf服务和各种各样的beast。该系统是一个处理工具,用于计算值,然后向各地发送消息和数据。
系统庞大复杂,不易调试。
我正在寻找一种方法/工具/想法,如何显示正在调用的函数和参数,以便我可以运行一些场景,并能够获得某种形式的视觉地图,显示一切如何配合在一起。
1)调试-是的,我知道我可以,但我想得到一个工具,生成某种类型的地图,而不必通过代码。现在我想把重点放在业务逻辑上。
2)日志语句/log4net -不要这样做,因为它需要更改/添加大量代码。
3)在调试期间查看callstack -这不会提供太多信息,只有最后几个调用。
我想我要找的可能是一个插件,所以我可以:运行我的进程->文件生成的方法列表和传递的参数。
谢谢
我以前用postsharp (http://www.postsharp.net/diagnostics)做过这个。你的第二个建议可行,而且不需要做太多修改。
您可以配置postsharp,以便在编译后重新编写程序集,以自动挂接到所有方法调用,并使用log4net等工具写出传递的内容,从而详细跟踪应用程序正在执行的操作。您唯一需要做的就是添加对postsharp的引用,并向assemblyinfo类添加一个属性,告诉postsharp要记录什么(如果他们的新诊断向导不自动执行该操作)
我使用免费的postsharp许可证在生产环境中做这件事——我最终编写了我自己的方面(OnMethodBoundaryAspect的实现),并在postsharp提供诊断模式库之前,用一行代码将它连接到一个非常大的遗留产品中的每个方法。
既然你有了Castle。温莎在那里我不会试图记录每一个电话的每一个功能。相反,我建议使用Castle。温莎拦截能力记录组件之间在其边界的通信。通过这种方式,您可以对哪些组件在一起、它们如何交互以及应用程序如何构建有一个全面的了解
代替一系列所有可能的class.function
调用,您可以得到遵循系统中每个重要接口的东西
IControllerFactory.Resolve
IController.Process
IBindingEngine.BuildModel
etc...
你必须使用城堡。温莎IInterceptor
。下面是这样一个拦截器的示例
public class LoggingInterceptor : IInterceptor
{
public ILogger Logger { get; set; }
public void Intercept(IInvocation invocation)
{
Logger.Debug(() =>
{
return String.Format("calling {0}.{1}"
, invocation.TargetType.Name
, invocation.Method.Name);
// add whatever information is important
// you can even dump the values of your parameters
});
invocation.Proceed();
}
}
注册它将是沿着这些行
_container.Register(
Classes.FromAssemblyInThisApplication()
.BasedOn<IInterceptor>()
.WithServiceBase()
.Configure(c => c.Named(c.Implementation.Name))
);
,然后您将其添加到您需要通过使用Interceptors("LoggingInterceptor")
方法对您选择的注册跟踪的组件。