我们将脚本托管在 out 应用程序中。在异常/崩溃时,我们希望查看堆栈跟踪中的行号。
在设置 CSScript 编译器时,我找不到包含调试信息的设置?
我相信你的意思是CS-Script(如果不是请纠正我)。我不确定你是怎么称呼它的,但我确实找到了这个命令行文档(他们的帮助文件中的位置似乎没有反映在他们的 URL 中,你需要导航到Overview -> Command-line interface
)。对于 .net,如果您有相应的.pdb
文件,则行号包含在堆栈跟踪中,如果在编译时没有进行优化,行号也将是正确的(这对于 CS-Script 来说应该不是问题)。在文档中cscs.exe
有一个 switch /dbg or /d
。当您包含此开关时,相应的.pdb
文件将包含在您的.exe
(或 .dll 中,如果构建一个库)。一旦你拥有这两个文件,行号现在将在任何给定异常的堆栈跟踪中可用,该异常命中该程序集中的操作。
/dbg 或 /d
强制编译器包含调试信息。
假设我们有一个Test.cs
用一些测试代码调用的文件:
cscs.exe /e /dbg Test.cs
这将输出 2 个文件:
这是 的示例内容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 来实现。在我下面的示例中,您将得到所有预期的 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();
}
}
我确实测试了这一切以确保它确实有效。如果您有问题,请告诉我。