查看所有函数调用和参数

本文关键字:参数 函数调用 | 更新日期: 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")方法对您选择的注册跟踪的组件。