【问题标题】:How do I show line numbers on stacktrace in a executing CSScript?如何在执行的 CSScript 中显示堆栈跟踪的行号?
【发布时间】:2016-02-23 10:08:41
【问题描述】:

我们将脚本托管在 out 应用程序中。在异常/崩溃时,我们希望查看堆栈跟踪中的行号。

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

【问题讨论】:

  • 下面的答案对你有帮助吗?如果不是,你还遇到什么?
  • 对不起,我一直在忙其他项目。将尽快检查答案。

标签: c# .net cs-script


【解决方案1】:

我相信你的意思是CS-Script如果不是请纠正我)。我不确定你是怎么称呼它的,但我确实找到了this command line documentation他们的帮助文件中的位置似乎没有反映在他们的 URL 中,你需要导航到 Overview -> Command-line interface)。对于 .net,如果您有相应的 .pdb 文件,则行号包含在堆栈跟踪中,并且如果在编译时未进行优化,行号也将是正确的(这对于 CS 来说应该不是问题-脚本)。在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();
        }
    }
}

内联执行

EvaluatorConfig 部分中的 DebugBuild 标志设置为 true 时,这也应该是可能的。在我下面的示例中,您将得到所有预期的 BUt,当使用 LoadCode 时,它使用一个临时文件名,因此文件名看起来很有趣,尽管行号是正确的。还有用于加载一个或多个文件的 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();
    }
}

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

【讨论】:

  • 我假设他们没有编译 C#,而是使用脚本库在他们的应用程序中将其作为脚本运行。除非 CSScript 对象上有启用调试的方法,否则动态发出的程序集不太可能具有行号(如您所说,该功能是基于 pdb 的)。
  • @Zastai - 我没想到这一点,谢谢!我更新了我的答案,有一个标志可以启用此功能(刚刚使用上面的代码对其进行了测试)并且似乎可以正常工作。无论您采用哪种方式,都会创建一个 .net 程序集(可以是临时的),因此也应该有创建 .pdb 的机会(只要该 API 支持该程序集)。
  • 我们正在我们的应用程序中运行它。这看起来不错,所以赏金。我错过了有更好的调试设置的新版本,所以谢谢你。但是,由于.. 很多错误,我无法升级到最新设置并对其进行测试。
  • 成功了。我不得不将 Microsoft.CSharp 程序集引用到 CSScript 评估程序中,但是一旦完成,它就可以很好地工作。再次感谢! :)
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 2021-01-18
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 2019-02-19
  • 2011-02-19
  • 1970-01-01
相关资源
最近更新 更多