如何在执行的 CSScript 中显示堆栈跟踪中的行号?

How do I show line numbers on stacktrace in a executing CSScript?

我们在应用程序中托管脚本。在 exceptions/crashes,我们希望在堆栈跟踪中看到行号。

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

我相信你的意思是CS-Script (if not please correct me). I am not sure how you are calling it but I did find this command line documentation(他们的帮助文件中的位置似乎没有反映在他们的URL中,你需要导航到Overview -> Command-line interface )。对于 .net,如果您有相应的 .pdb 文件,行号将包含在堆栈跟踪中,并且如果在编译时没有进行优化,行号也将是正确的(这不应该是CS-Script 的一个问题)。在 cscs.exe 的文档中有一个开关 /dbg or /d。当您包含此开关时,相应的 .pdb 文件将包含在您的 .exe 中( 或者如果构建库 则包含 .dll)。一旦你拥有这两个文件,行号现在将在任何给定异常的堆栈跟踪中可用,该异常命中该程序集中的操作。

/dbg or /d

Forces compiler to include debug information.

假设我们有一个名为 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();
        }
    }
}

用于执行内联

如果 EvaluatorConfig 部分中的 DebugBuild 标志设置为 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();
    }
}

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