9

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

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 属性中看到行号。我假设这意味着我拥有我需要的一切。

4

1 回答 1

17

根据StackTrace 构造函数重载的文档,该文件出现异常,您在以这种方式创建 StackTrace 时不能期望行号。

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

要获取行号,您需要使用采用 bool 和异常的重载

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

于 2010-02-09T12:20:26.317 回答