2016-08-22 25 views
4

我正在嘗試將行號和幀寫入文本文件,但我無法使其工作。根據我在網上閱讀的內容,我寫這篇文章的方式應該可行,但實際上並沒有輸出任何行號,這使得我的調試非常困難。任何人都可以協助指出我的代碼可能是錯的嗎?如何顯示捕捉異常的行號和框架?

catch (Exception e) 
     {     
      var st = new StackTrace(e, true); 
      var frame = st.GetFrame(0); 
      var line = frame.GetFileLineNumber(); 
      var sw = new System.IO.StreamWriter(filename, true); 

      sw.WriteLine(
       DateTime.Now.ToString() + "\r\n" 
       + e.Message + "\r\n" 
       + e.InnerException + "\r\n"      
       + e.Source + "\r\n" 
       + frame + "\r\n" 
       + line); 
      sw.Close(); 

     } 

它確實輸出一些信息,而不是行/幀數。

以下是獲取輸出的示例。

22/08/2016 08:34:24 
Input string was not in a correct format. 
StringToNumber at offset 12099653 in file:line:column <filename unknown>:0:0 0 

另外請注意,應用程序運行在Debug not Release中。

+0

它是什麼打印呢?提示:你真的不應該把這樣的代碼直接放在你的catch塊中。相反:定義一些方法/接口爲你做這樣的日誌記錄;並只在你的catch中調用這些方法。或者你打算將這些代碼複製到每個catch塊?最後:你不應該**絕對**確保**沒有其他**異常可以拋出你的catch塊?你想在運行時發生的最後一件事情是你的「生產代碼」中的異常會丟失......因爲後續的異常試圖在你的catch塊中記錄東西? – GhostCat

+0

你能檢查代碼的PDB文件是否加載到內存中?您可以通過在代碼中設置斷點並運行代碼來快速檢查,如果紅色圓圈沒有完全着色,則表示符號(PDB文件)未加載。沒有該文件加載,行號將始終爲0. –

+0

我懷疑你可以得到文件名和行號,如果異常發生在一個.Net程序集(例如mscorlib),除非你以某種方式使用這些程序集的pdb文件 - 如果我沒有錯,你可以從微軟下載它們 –

回答

2

確保您的應用程序是以DEBUG模式構建的。如果它在Release中,則比例行文本中不包括行號等信息。

另一個可能的原因是,你編輯的調試配置爲您的項目和殘疾人調試信息(項目設置=>生成=>高級=>輸出調試信息)

最後,你需要的行號PDB文件,它們應與您的.exe/.dll文件位於同一文件夾中。默認情況下,它們在那裏,直到您手動刪除它們或將應用程序的某些部分複製到另一個位置並在那裏運行。

+0

你可以在RELEASE版本中有行號 - 你只需要擁有PDB。 –

+0

以上所有內容似乎都是爲了配對。 – Yanayaya