在Debug.Assert语句中插入行号

时间:2010-10-06 00:00:24

标签: c# .net debugging

我们使用Debug.Assert向开发人员发出代码中的问题。我想添加错误发生的行号但不是硬代码,因为这可能会改变,我们会忘记更新字符串。

添加错误的行号会很方便。有什么想法吗?

4 个答案:

答案 0 :(得分:8)

默认情况下,Debug.Assert已包含堆栈跟踪信息:

  

当应用程序在用户界面模式下运行时,它会显示一个消息框,显示带有文件和行号的调用堆栈。

示例:

alt text

如果您在断言对话框中没有看到文件名或行号,则PDB文件(作为编译的一部分生成)将丢失或无法访问。 PDB文件包含文件和行调试信息。

在C#中没有真正等效的C / C ++的__FILE____LINE__魔术宏,但是如果您仍然希望在断言对话框之外使用此信息,则可以使用StackTrace上课得到它。这要求您提供调试信息(上面提到的PDB文件)。由于您可能正在使用它进行开发,因此这是一个安全的要求。

using System.Diagnostics;

namespace Managed
{
    class Program
    {
        static void Main(string[] args)
        {
            AssertWithCallSite(false, "Failed!");
        }

        [Conditional("DEBUG")]
        static void AssertWithCallSite(bool condition, string message)
        {
            if (!condition)
            {
                var callSite = (new StackTrace(1, true)).GetFrame(0);

                string fileName = callSite.GetFileName();
                int lineNumber = callSite.GetFileLineNumber();

                string assertMessage = string.Format(
                    "Assert at {0}:{1}:\n{2}",
                    fileName,
                    lineNumber,
                    message
                );

                Debug.Assert(false, assertMessage);
            }
        }
    }
}

答案 1 :(得分:2)

看看Whats the equivalent of LINE and FILE in C#

string currentFile=new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileName(); 
int currentLine = new System.Diagnostics.StackTrace(true).GetFrame(0).GetFileLineNumber();  

请务必查看上面的文章,因为有一些需要注意的注意事项。

答案 2 :(得分:1)

是的,这是可能的。请查看StackTrace命名空间中的StackFrameSystem.Diagnostics

示例

static string GetDiagnosticsInformationForCurrentFrame()
{
    StackTrace st = new StackTrace(new StackFrame(true));        
    StackFrame sf = st.GetFrame(1); // we want the frame from where this method was called

    return String.Format("File: {0}, Method: {1}, Line Number: {2}, Column Number: {3}", sf.GetFileName(), sf.GetMethod().Name, sf.GetFileLineNumber(), sf.GetFileColumnNumber());
}

...

Debug.Assert(true, "Unexpected error occurred at " + GetDiagnosticsInformationForCurrentFrame());

编辑正如克里斯指出的那样,你不能拥有Conditional的回复类型。我已经改变了我的答案,以便GetDiagnosticsInformationForCurrentFrame始终可用。

答案 3 :(得分:1)

C#6.0,UAP个应用。这很好用

 public static void Assert(bool val, string message,  [CallerFilePath] string file = "",  [CallerMemberName] string memberName = "", [CallerLineNumber] int lineNumber = 0)
    {
        string msg = String.Format($"File: {file}, Method: {memberName}, Line Number: {lineNumber}\n\n{message}");
        Debug.Assert(val, msg);


    }