在发布模式下部署的ASP.NET网站中添加堆栈跟踪行号

7
我正在维护一个网站,该网站具有错误日志功能。 客户偶尔会在网站上遇到问题,但只能在堆栈跟踪中看到方法调用层次结构和异常发生的位置,而不能显示出错行号。 在我的开发环境中显式引发异常时,异常的堆栈跟踪显示了方法调用层次结构及其实际异常发生的行号。 我知道在生产环境中,我们仅部署DLL,这就是为什么日志文件中没有获得错误行号的原因。 有人有任何想法,如何在仅部署DLL(程序集)时也能获取异常的错误行号吗?

你是否在使用log4net进行日志记录? - Carbine
在发布模式下构建您的项目,然后将堆栈跟踪异常。@Neeraj Kumar Gupta - Rezoan
1
看起来它会工作,我在我的电脑上尝试了一个样例应用程序,但是我的实际应用程序部署过程都由客户自己完成,所以如果他们在调试模式下构建应用程序并部署pdb文件,是否会导致任何性能问题? - Neeraj Kumar Gupta
@bharath 不,我们有自己的错误日志记录器。 - Neeraj Kumar Gupta
“Debug” 构建确实会对性能产生影响 - 正如 这里 所述。您最好在 “Release” 构建中启用调试符号 - 就像 Anders Abel 在他的回答中建议的那样。 - Andrii Kalytiiuk
3个回答

15
在构建设置中,将您的项目设置为在发布模式下也生成调试符号(pdb:s)。如果生成了它们,它们将自动包含在部署中。无需在调试模式下运行整个站点,只需要可用的调试符号即可。
该设置位于项目属性中。选择发布时使用的构建配置。然后在“生成”选项卡上,点击“高级...”按钮,并将调试信息设置为“完整”。

我该如何设置它?你能详细说明步骤吗? - Neeraj Kumar Gupta
1
在发布网站窗口中选择“发出调试信息”,是正确的吗? - Neeraj Kumar Gupta
也许可以那样做,但我通常在构建设置中完成。请查看我的编辑。 - Anders Abel
同时,当将其更改为“Full”时,不应忘记在 Visual Studio 中将项目也切换到发布模式。 - Jaanus
2
我在发布配置中将“调试信息”设置为完整,然后进行了发布。但是我的堆栈跟踪仍然没有行号。在本地它显示了类似 System.Data.Entity 堆栈直到最终异常的内容,在生产环境中堆栈停止于我的调用方法。你能帮我吗? - Tiago Gouvêa

5
前面Anders Abel的回答已经完全满足了您的需求。不过我想补充一种更加架构化的方法,即重构您的日志引擎以使用C#5.0中的新Caller Information属性。
例如,您可以使用这种方法记录异常。
public static void NDLogException(Exception ex,
               [System.Runtime.CompilerServices.CallerFilePath] string sourceFilePath = "",
               [System.Runtime.CompilerServices.CallerMemberName] string memberName = "",
               [System.Runtime.CompilerServices.CallerLineNumber] int sourceLineNumber = 0)

编译器将推断并填充默认参数与相应的值。属性CallerLineNumber是您特别寻找的属性。
当然,这需要您更改您的代码(假设您可以使用它)。
有关调用者信息属性的更多信息,请阅读此处

0

这是C#5的新功能,例如你可以这样做:

public class LogManager
{
    public void LogException(Exception exc,
                            [CallerMemberName] string memberName = "",
                            [CallerFilePath] string sourceFilePath = "",
                            [CallerLineNumber] int sourceLineNumber = 0)
    {
        Trace.WriteLine(string.Format("Date: {0}", DateTime.Now));
        Trace.WriteLine(string.Format("Exception: {0}", exc.Message));
        Trace.WriteLine(string.Format("Occured in: {0}", memberName));
        Trace.WriteLine(string.Format("source file path: {0}", sourceFilePath));
        Trace.WriteLine(string.Format("source line number: {0}", sourceLineNumber));
    }
}

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