查看所有函数调用和参数

时间:2014-03-27 13:28:15

标签: c# logging visual-studio-debugging

我使用nhibernate / castle Windsor,wcf服务和各种野兽继承了一个相当大的项目。该系统是一个处理工具,用于计算值,然后在整个地方发送消息和数据。

系统庞大而复杂,不易调试。

我正在寻找一种方法/工具/想法,了解如何显示正在调用的函数以及使用什么参数,以便我可以运行一些场景并能够获得某种如何将所有东西组合在一起的可视化映射

1)调试 - 是的,我知道我可以,但我想获得一个生成某种地图的工具,无需通过代码。我现在想专注于业务逻辑。

2)日志语句/ log4net - 不想这样做,因为它需要更改/添加大量代码。

3)在调试期间查看callstack - 它不会提供太多信息,只会提供最后几次调用。

我想我正在寻找的可能是一个插件,所以我可以: 运行我的流程 - >使用调用的方法列表和传递的参数生成的文件。

由于

2 个答案:

答案 0 :(得分:0)

我过去使用postharp(http://www.postsharp.net/diagnostics)完成了这项工作。你的第二个建议是有效的,而且不必引入很多变化。

您可以将postharp配置为在编译后重新编写程序集,以自动挂接到所有方法调用,并使用log4net之类的内容写出传递的内容,以便详细了解应用程序正在执行的操作。您需要做的唯一事情是添加对postsharp的引用,并向assemblyinfo类添加一个属性,告诉postsharp要记录的内容(如果他们的新诊断向导不自动执行此操作)

我正在使用免费的postharp许可证进行生产 - 我最终编写了我自己的方面(OnMethodBoundaryAspect的实现),并在诊断之前使用一行代码将其连接到一个非常大的遗留产品中的每个方法模式库可以从postsharp获得。

答案 1 :(得分:0)

由于你已经有了Castle.Windsor,我不会尝试记录每个函数的每次调用。相反,我建议使用Castle.Windsor拦截功能来记录其边界组件之间的通信。通过这种方式,您可以全面了解哪些组件在一起,它们如何交互以及如何构建应用程序

而不是一系列所有可能的class.function次调用,您可以获得跟随系统中每个重要界面的内容

IControllerFactory.Resolve
IController.Process
IBindingEngine.BuildModel
etc...

为此你必须使用Castle.Windsor 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")方法将其添加到需要跟踪的组件中。