0

可能重复:
如何向 C# 中的每个方法调用添加 Trace()?

在下面的示例中,我在每个方法中插入调试信息,以便我可以看到调用了哪个函数:

namespace A
{
    class A1
    {
        void f1()
        {
            Console.WriteLine("inside A.A1.f1");  //1
        }
        void f2()
        {
            Console.WriteLine("inside A.A1.f2");  //2
        }
    }
 }

在不同的命名空间和类下有数百种方法。
将调试消息一一插入到每个方法中既麻烦又浪费时间。
除了像上面那样插入特定于方法的调试消息之外,还有更好的方法吗?
也许一个 API 函数可以告诉我在哪个方法中?

4

2 回答 2

1

如果您使用的是 VS 2012,我会告诉WriteLine.

不幸的是,在 VS2010 中这是不可能的。你可以调用这样的东西,但它真的不会是高性能的:

namespace A
{
    public static class DebugHelper
    {
        [Conditional("DEBUG")]
        public static void LogMethodName()
        {
            var method = new StackFrame(1).GetMethod();
            Console.WriteLine("inside {0}.{1}", method.DeclaringType, method.Name);
        }
    }
    class A1
    {
        void f1()
        {
            DebugHelper.LogMethodName();  //1
        }
        void f2()
        {
            DebugHelper.LogMethodName();  //2
        }
    }
 }
于 2013-01-03T01:21:03.847 回答
1

StackTraceStackFrame类可能会提供您需要的信息(请注意,内联方法不会获取堆栈帧):

catch (Exception e)
{
  StackTrace st = new StackTrace();
  StackTrace st1 = new StackTrace(new StackFrame(true));
  Console.WriteLine(" Stack trace for Main: {0}",
    st1.ToString());
  Console.WriteLine(st.ToString());
}
于 2013-01-03T01:17:31.173 回答