2016-02-23 33 views
3

我們在應用程序中託管腳本。在異常/崩潰時,我們希望看到堆棧跟蹤中的行號。如何在執行的CSScript中顯示stacktrace的行號?

我無法找到設置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或/ d

強制編譯器包括調試信息。

假設我們有一個用一些測試代碼調用Test.cs文件:

cscs.exe /e /dbg Test.cs 

這將輸出2個文件:

  • 將Test.exe
  • Test.pdb

這裏是0的示例內容,當你執行它時,你會看到行號。

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部分設置爲true DebugBuild標誌。在我的下面的例子中,當使用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(); 
    } 
} 

我沒有測試過這一切,以確保它的工作。如果您遇到問題,請告訴我。

+1

我假設他們沒有編譯C#,而是將其作爲腳本在應用程序中使用腳本庫運行。除非啓用調試的CSScript對象上有方法,否則動態發射的程序集不太可能擁有行號(正如您所說,該功能是基於pdb的)。 – Zastai

+0

@ Zastai - 我沒想過,謝謝!我更新了我的答案,有一個標誌來啓用它(現在用上面的代碼對它進行測試),並且似乎可行。無論採取哪種方式,您都可以創建一個.net程序集(可以是臨時的),因此創建.pdb的機會也應該在那裏(只要這個API支持)。 – Igor

+0

我們在我們的應用中運行它。這看起來不錯,給予賞金。我錯過了有更好的調試設置的新版本,所以謝謝你。但是,我無法升級到最新的設置,並且由於很多錯誤而進行測試。 – Macke