2016-02-23 2 views
3

У нас есть сценарий в приложении. В случае исключений/сбоев мы хотели бы видеть номер строки в стеке.Как показать номера строк в stacktrace в исполняемом CSScript?

Я не могу найти, есть ли параметр для включения информации об отладке при настройке компилятора CSScript?

+0

Помогает ли вам ответить ниже? Если нет, в чем вы все еще сталкиваетесь? – Igor

+1

Извините, я был занят другими проектами. Будет проверять ответ как можно скорее. – Macke

ответ

2

Я считаю, вы имеете в виду CS-Script (если нет, то скорректируйте меня). Я не уверен, как вы это называете, но я нашел this command line documentation (кажется, что позиция в файле справки не отображается в их URL-адресе, вам необходимо перейти на Overview -> Command-line interface). С .net номер строки включается в трассировку стека, если у вас есть соответствующий файл .pdb, а номер строки также будет правильным, если во время компиляции не будет выполнена оптимизация (это не должно быть проблемой для CS-Script) , В документации для cscs.exe есть переключатель /dbg or /d. Когда вы включите этот переключатель, соответствующий файл .pdb будет включен в ваш .exe (или с .dll, если вы строите библиотеку). После того, как у вас есть оба номера строк строк, теперь будет доступно в трассировке стека любого исключения, которое попадает на операцию в этой сборке.

/DBG или/д компилятор

силы, чтобы включать информацию отладки.

Предположим, у нас есть файл с именем 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(); 
     } 
    } 
} 

для выполнения инлайн

Это также должно быть возможным с DebugBuild флагом в разделе EvaluatorConfig значение ИСТИНА. В моем примере ниже вы получите все ожидаемое 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(); 
    } 
} 

Я сделал тест все это, чтобы проверить, что он делает работу. Если у вас есть проблемы, просто дайте мне знать.

+1

Я предполагаю, что они не компилируют C#, а запускают его как скрипт в своем приложении, используя библиотеку сценариев.Если в объекте CSScript не предусмотрены методы, позволяющие отлаживать, маловероятно, что динамически выпущенные сборки будут иметь номера строк (как вы говорите, эта функциональность основана на pdb). – Zastai

+0

@ Zastai - Я об этом не думал, спасибо! Я обновил свой ответ, есть флаг, чтобы включить это (протестировал его только сейчас с помощью кода выше) и, похоже, работает. В любом случае вы подходите к нему, будет создана сборка .net (которая может быть временной), поэтому также должна быть возможность создать .pdb (до тех пор, пока поддерживается API, который это сделал). – Igor

+0

Мы запускаем его в нашем приложении. Это выглядит нормально, так щедрость дается. Я пропустил, что появилась новая версия с лучшими настройками для Debug, поэтому спасибо за это. Тем не менее, я не мог обновиться до последней настройки и проверить ее из-за .. большого количества ошибок. – Macke

Смежные вопросы