2

我工作的一個工具,在使用Mono.Cecil能.NET二進制代碼進行分析行0xFEEFEE號。作爲其中的一部分,我還檢查了二進制文件的.pdb文件以將結果鏈接到源代碼行。如何限制在PDB文件

也能正常工作在大多數情況下:我從.PDB正確的源文件路徑和行號。然而,在某些情況下(我相信當代碼是#region內,但不能肯定),行數設置爲16707566(0xFEEFEE)。這是一個鮮爲人知的compiler feature來表明該行對用戶是隱藏的。問題是,當.pdb包含0xFEEFEE作爲行號時,我不能用它做很多事情 - 我不能(很容易)將我的分析結果回到源代碼中。

我試圖更改一些Visual Studio選項,然後重新構建我正在分析的代碼,但我仍然將0xFEEFEE作爲區域中代碼的行號。 (例如,我嘗試禁用區域,但它並沒有幫助,另外分析的代碼是從構建腳本構建的,而不是從IDE構建的。)

是否可以告訴C#編譯器(可能通過.csproj設置或在註冊表中)總是發出真實的行號(當它有意義時 - 對於'真實'的源代碼行)並且不使用這些隱藏的行標記?

回答

2

這竟然是我的代碼中的一個問題 - 是缺乏經驗與PDB文件,我認爲編譯器會輸出第一指令的第一序列點的方法的身體。情況並非如此:編譯器有時會爲不直接映射到原始源代碼的函數生成代碼,因此第一個「用戶」序列點可能不是方法體中的第一條指令。

我通過方法體的所有指令必須循環,尋找一個有意義的行號的第一個序列點 - 這從根本上減少隱線我得到的數目。