为什么从异常创建的堆栈跟踪中得不到行号?

10

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

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属性中的行号。我假设这意味着我已经拥有了所需的一切。

1个回答

18
根据接收异常的StackTrace构造函数重载的文档,创建StackTrace时不能指望行号信息。

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

要获取行号信息,需要使用带有布尔值和异常参数的重载

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


既然我可以在异常堆栈跟踪字符串中看到行号,那么这是否意味着我确实有 pdb 文件? - EightyOne Unite
我认为这不是缺少pdb的情况,因为他能够看到行号。 - Gerrie Schenck
思考一下,将标准的StackFrame接口抽象化,再创建一个子类(例如FileInfoStackFrame),该子类公开文件信息,而不是通过重载构造函数来决定什么时候使用这些属性,这样岂不更好?这个接口对我来说似乎定义得很差。嗯... - EightyOne Unite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接