отладка: pdbonly разница между .Net 2 и .Net 4 - PullRequest
0 голосов
/ 20 сентября 2010

Я следовал этому примеру с веб-страницы Скотта Хансельмана: http://www.hanselman.com/blog/ReleaseISNOTDebug64bitOptimizationsAndCMethodInliningInReleaseBuildCallStacks.aspx

Моя цель - получить номер строки, из которой выдается исключение, а не там, где оно перехватывается.

Когда я компилирую код с помощью следующего скрипта сборки, он не будет работать

SET FXROOT=%Systemroot%\Microsoft.NET\Framework\v4.0.30319

DEL *.exe /q

"%FXROOT%\csc.exe" /t:exe /out:NormalRelease.exe /debug:pdbonly /o+ NormalProgram.cs

NormalRelease.exe > NormalRelease32.txt

Вывод:

System.ApplicationException: generic bad thing
   at NormalProgram.Main(String[] args) in c:\Development\DebugSymbols\DebugSymConsole\NormalProgram.cs:line 8

Когда я компилируюкод с этим сценарием сборки будет работать

SET FXROOT=%Systemroot%\Microsoft.NET\Framework\v2.0.50727

DEL *.exe /q

"%FXROOT%\csc.exe" /t:exe /out:NormalRelease.exe /debug:pdbonly /o+ NormalProgram.cs

NormalRelease.exe > NormalRelease32.txt

Вывод:

System.ApplicationException: generic bad thing
   at NormalProgram.badMethod() in c:\Development\DebugSymbols\DebugSymConsole\NormalProgram.cs:line 18
   at NormalProgram.Main(String[] args) in c:\Development\DebugSymbols\DebugSymConsole\NormalProgram.cs:line 8

Разница в том, что в моем первом примере я скомпилировал против .net2-framework, а во втором примере я скомпилировал против .net4-framework.

Буду признателен за любые решения моей проблемы, спасибо.

1 Ответ

2 голосов
/ 20 сентября 2010

Это то, с чем вам придется иметь дело, если вы собираетесь генерировать номера строк из кода, сгенерированного в конфигурации Release. Оптимизатор JIT-компилятора включен, и он собирается перемещать код для создания более эффективного машинного кода. Это повлияет на точность сообщенного номера строки.

Конкретный обходной путь здесь заключается в применении этого атрибута к "badMethod":

using System.Runtime.CompilerServices;
...
        [MethodImpl(MethodImplOptions.NoInlining)]
        void badMethod() {
            // etc...
        }

Это не радостный обходной путь, встраивание - важная оптимизация, особенно для методов получения / установки свойств. Причина, по которой он отличается в .NET 2.0 и 4.0, заключается в том, что у них разные дрожания с разными правилами для определения того, когда метод должен быть встроен.

...