小编han*_*odb的帖子

调试后台服务上的堆栈溢出错误

这不是一个真正的问题,而是一个有希望帮助其他人的答案.

那些以前写过Windows服务的人,知道在其中发现错误的任务是什么,特别是如果它只发生在实时环境中.就我而言,我有一个服务运行了几个小时,然后从堆栈溢出错误中解决了.没有堆栈跟踪.祝你在大海捞针中找到针.

该服务确实生成了一个日志文件,代码中充斥着日志条目,但详细说明,它生成了500 MB的日志文件!你几乎无法打开文件,不要介意分析它.但是你如何解决这个问题呢?您可以尝试生成信息较少的日志文件,或者在编写较新的日志条目时自动删除旧日志条目,但随后会丢失重要的错误上下文.

解决方案是一个日志文件,它将跟踪代码中的循环,并自动删除该循环的每次成功迭代的日志条目.这样,您可以维护一个高度拘留的日志文件,该文件同时保持相对较小.当您的服务中断时,您的日志文件将告诉您确切的位置,以及解释其发生方式和原因的所有必要上下文.

您可以从http://sourceforge.net/projects/smartl/files/?source=navbar下载此日志文件生成器.它是一个独立的类,它的所有方法都是静态的.提供了一个示例类,向您展示如何正确使用日志记录方法:

    public void ExampleMethod()
    {           
        SmartLog.EnterMethod("ExampleMethod()"); 
        try
        {
            SmartLog.Write("Some code happening before the loop");

            Guid exampleLoopID = SmartLog.RegisterLoop("exampleLoopID");
            for (int i = 0; i < 10; i++)
            {
                SmartLog.IncrementLoop(exampleLoopID);

                SmartLog.Write("Some code happening inside the loop.");

            }
            SmartLog.CompleteLoop(exampleLoopID);

            SmartLog.Write("Some code happening after the loop.");

            SmartLog.LeaveMethod("ExampleMethod()");
        }
        catch (Exception ex)
        {
            SmartLog.WriteException(ex);
            SmartLog.LeaveMethod("ExampleMethod()");
            throw;
        }
    }
Run Code Online (Sandbox Code Playgroud)

确保您的应用程序在其根文件夹上具有读写访问权限.

如果您执行代码,并在循环内部将其分解,则日志文件将如下所示:

. ENTER METHOD: FirstMethod()
some code happening here.
Calling a different method:

. . ENTER METHOD: ExampleMethod() …
Run Code Online (Sandbox Code Playgroud)

c# debugging windows-services logfile

10
推荐指数
1
解决办法
278
查看次数

标签 统计

c# ×1

debugging ×1

logfile ×1

windows-services ×1