如果我在方法的開始處添加1行,如果我在第一行通過Visual Studio設置斷點,它會指向第一行還是第二行?如果它會標記錯誤的行,那麼編輯.exe文件時我們可以做些什麼來確保稍後進行常規調試會話?如果我們在IL代碼中添加行併爲我們的程序添加斷點,會發生什麼?
是不是有沒有像設置行x是Y?我記得在某處看到類似的東西,不知道.NET是否相關。
如果我在方法的開始處添加1行,如果我在第一行通過Visual Studio設置斷點,它會指向第一行還是第二行?如果它會標記錯誤的行,那麼編輯.exe文件時我們可以做些什麼來確保稍後進行常規調試會話?如果我們在IL代碼中添加行併爲我們的程序添加斷點,會發生什麼?
是不是有沒有像設置行x是Y?我記得在某處看到類似的東西,不知道.NET是否相關。
如果您希望調試體驗保持不變,您需要更新PDB文件中的調試符號。
我見過的最佳選擇是使用Mono.Cecil,因爲它支持調試符號以及IL的(有限)修改。
感謝您的回答。我正在使用Cecil,偶爾你能指出我如何通過它來修改調試符號嗎? – 2009-08-08 01:07:50
查看常見問題解答:http://www.mono-project.com/Cecil:FAQ從我記憶中可以看出,裝配工也可以加載PDB文件,在這種情況下,我認爲它會自動進行修改。 – 2009-08-08 22:48:11
如果您正在修改IL,那麼PDB文件將包含過時的信息。請注意,IL行到C#行#s的變化之間可能不會有1:1(例如,插入3個IL語句不會將IDE斷點偏移3行C#)。
您可能希望將代碼的IL修改部分分隔爲單獨的方法以最大限度地減少影響。另外,假設您是進行IL修改的人員,您可能會發現在調試過程中在C#& IL視圖之間切換很方便。
您可能需要使用生成的代碼進行一些操作以便於實現。例如,如果注入的IL可以在包裝方法中,那麼可以通過使用諸如DebuggerStepThroughAttribute,DebuggerNonUserCodeAttribute或DebuggerHiddenAttribute等屬性來告訴調試器忽略它。 (查看文檔中的行爲細微差別)
我知道沒有直接的對應關係。我想要做的只是「忽略」我編譯的exe文件上的代碼。這是,如果我在方法的開始處插入10條IL行,我希望調試器將第11行看作第一行。 – 2009-08-08 02:12:09
您可能需要使用生成的代碼進行一些操作,以便於實現。例如,如果注入的IL可以在包裝方法中,那麼可以通過使用諸如DebuggerStepThroughAttribute,DebuggerNonUserCodeAttribute或DebuggerHiddenAttribute等屬性來告訴調試器忽略它。 (查看文檔中的行爲細微差別)。 – Addys 2009-08-10 08:29:56
我也給答案本身添加了建議 – Addys 2009-08-10 08:31:19
我希望你得到標記爲.pdb文件可能不匹配。
你如何添加IL?如果你通過分析器工具(SetILFunctionBody)來完成這個工作,那麼你還需要提供一個新的IL代碼映射(SetILInstrumentationCodeMap),以便調試器知道IL修改。
我正在通過cecil – 2009-08-08 21:26:08
你爲什麼不試試看看? – Christopher 2009-08-08 00:37:00