【问题标题】:Why do I get no line numbers from a stack trace created from Exceptions?为什么我从异常创建的堆栈跟踪中没有得到行号?
【发布时间】:2011-01-14 19:02:42
【问题描述】:

好的;假设这段代码在调试模式下运行 -

static StackFrame GetTopFrameWithLineNumber(Exception e)
{
    StackTrace trace = new StackTrace(e);
    foreach (StackFrame frame in trace.GetFrames())
    {
        if (frame.GetFileLineNumber() != 0)
        {
            return frame;
        }
    }
    return null;
}

我总是返回 null。当我检查Exception.StackTrace 字符串时,为什么堆栈帧没有行号,它显然对任何非框架代码都有它们?从我不知道的异常构造堆栈跟踪是否存在一些问题?

为清晰而编辑: 在抛出的异常中,我可以看到 StackTrace 属性中的行号。我假设这意味着我拥有我需要的一切。

【问题讨论】:

    标签: .net debugging stack-trace line-numbers


    【解决方案1】:

    根据documentation on the StackTrace constructor overload that takes an exception,您在以这种方式创建 StackTrace 时不能期望行号。

    StackTrace 是使用 调用者的当前线程,而不是 包含文件名、行号或 列信息。

    要获取行号,您需要使用the overload that takes a bool as well as the exception

    您还需要用于行号的符号文件 (pdb)。符号文件可用于调试和发布版本。

    【讨论】:

    • 因为我可以在 exception.stacktrace 字符串中看到行号,但这不意味着我确实有 pdb?
    • 我不认为这是缺少 pdb 的情况,因为他能够看到行号。
    • 考虑到这一点,将标准的 StackFrame 接口抽象化并有一个暴露文件信息的子类(例如 FileInfoStackFrame)而不是让重载的构造函数决定这些属性何时是不是更好合适的?对我来说,这似乎是一个定义不明确的接口。嗯...
    猜你喜欢
    • 2018-12-03
    • 2014-02-05
    • 1970-01-01
    • 2014-09-30
    • 2012-07-11
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    • 2019-05-17
    相关资源
    最近更新 更多