gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 16:50:03 25 4
gpt4 key购买 nike

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

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

最佳答案

我相信你的意思是 CS-Script (如果不是请纠正我)。我不确定你怎么调用它,但我确实找到了 this command line documentation (他们的帮助文件中的位置似乎没有反射(reflect)在他们的 URL 中,您需要导航到 Overview -> Command-line interface)。对于 .net,如果您有相应的 .pdb 文件,行号将包含在堆栈跟踪中,如果在编译时没有进行优化,行号也将是正确的(这应该对 CS-Script 来说不是问题)。在 cscs.exe 的文档中有一个开关 /dbg 或/d。当您包含此开关时,相应的 .pdb 文件将包含在您的 .exe 中(如果构建库,则包含在 .dll 中)。一旦您拥有这两个文件,行号现在将在任何给定异常的堆栈跟踪中可用,该异常命中该程序集中的操作。

/dbg or /d

Forces compiler to include debug information.

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

cscs.exe /e /dbg Test.cs

这将输出 2 个文件:

  • 测试.exe
  • 测试.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();
}
}

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

关于c# - 如何在执行的 CSScript 中显示堆栈跟踪中的行号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35574488/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com