我们在app中托管脚本。在异常/崩溃时,我们希望在堆栈跟踪中看到行号。
在设置CSScript编译器时,我找不到是否包含调试信息的设置?
答案 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.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();
}
}
我测试了这一切,以确保它确实有效。如果您遇到问题,请告诉我。