如何在执行的CSScript中在stacktrace上显示行号?

时间:2016-02-23 10:08:42

标签: c# .net cs-script

我们在app中托管脚本。在异常/崩溃时,我们希望在堆栈跟踪中看到行号。

在设置CSScript编译器时,我找不到是否包含调试信息的设置?

1 个答案:

答案 0 :(得分:2)

我相信你的意思是CS-Script如果不是请纠正我)。我不确定您是如何调用它但我确实找到了this command line documentation它们的帮助文件中的位置似乎未反映在其网址中,您需要导航到Overview -> Command-line interface )。使用.net,如果您有相应的.pdb文件,则行号包含在堆栈跟踪中,如果在编译时没有完成优化,则行号也将正确(这应该不是问题for CS-Script )。在cscs.exe的文档中,有一个开关/dbg or /d。当您包含此切换时,相应的.pdb文件将包含在您的.exe或.dll,如果构建库)中。一旦有了这两个文件,行号就会出现在任何给定异常的堆栈跟踪中,该异常会触及该程序集中的操作。

  

/ dbg或/ d

     

强制编译器包含调试信息。

假设我们有一个名为Test.cs的文件,其中包含一些测试代码:

cscs.exe /e /dbg Test.cs

这将输出2个文件:

  • 将Test.exe
  • Test.pdb

以下是Test.cs的示例内容,执行时您会看到行号。

using System;
namespace MyProgram
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                throw new Exception("OH NO");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.StackTrace);
            }
            Console.ReadLine();
        }
    }
}

执行内联

DebugBuild部分中的EvaluatorConfig标志设置为true也是可以的。在下面的示例中,当使用LoadCode时,您将获得所有预期的BUt它使用临时文件名,因此尽管行号正确,但文件名看起来很有趣。还有用于加载一个或多个文件的LoadXXX命令,这些命令将提供更漂亮的堆栈跟踪,因为文件名现在已知。

class Program
{
    static void Main(string[] args)
    {
        CSScript.EvaluatorConfig.DebugBuild = true;
        CSScript.EvaluatorConfig.Engine = EvaluatorEngine.CodeDom;

        Console.WriteLine("Debug on = " + CSScript.Evaluator.DebugBuild);

        dynamic script = CSScript.Evaluator
                     .LoadCode(@"using System;
                                 public class Script
                                 {
                                     public int Sum(int a, int b)
                                     {
                                         try{
                                         throw new Exception();}
                                         catch(Exception ex){
                                           Console.WriteLine(ex.StackTrace);
                                         }
                                         return a+b;
                                     }
                                 }");
        int result = script.Sum(1, 2);
        Console.WriteLine(result);
        Console.ReadLine();
    }
}

我测试了这一切,以确保它确实有效。如果您遇到问题,请告诉我。