2012-01-03 4 views
3

Я понимаю, что с дампом сбоя сборки debug вы можете получить номер строки трассировки стека, и этого не происходит с выпуском сборки. Чтобы попробовать это, я создал очень простое приложение, которое сбой.Получение номеров строк кода нарушения в debug vs release builds

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("Press any key to continue"); 
     Console.ReadKey(); 
     TestMe(null); 
    } 


    static void TestMe(MyClass c) 
    { 
     Console.WriteLine(c.Field); 
    } 
} 

class MyClass 
{ 
    public string Field { get; set; } 
} 

Я создал одну сборку отладки и одну сборку выпуска. Вызвали оба из них и навалили аварийную свалку через ADPlus. Ниже приведены трассировки стека для каждой сборки. Как вы можете видеть, я получаю номер строки в обеих сборках. Очевидно, что разница в том, что в релизе строят свой отчетный вызов метода TestMe. Любые идеи почему? Мне нужно добавить путь символов для применения PDB файлов в обоих случаях

Debug построить

0:000> !CLRStack 
OS Thread Id: 0x2398 (0) 
Child SP IP  Call Site 
001eee74 003400db ConsoleApplication1.Program.TestMe(ConsoleApplication1.MyClass)*** WARNING: Unable to verify checksum for ConsoleApplication1.exe 
[c:\ConsoleApplication1\ConsoleApplication1\Program.cs @ 20] 
001eee84 003400a5 ConsoleApplication1.Program.Main(System.String[]) [c:\ConsoleApplication1\ConsoleApplication1\Program.cs @ 14] 
001ef0c8 6ccb21bb [GCFrame: 001ef0c8] 

релиз построить

0:000> !CLRStack 
OS Thread Id: 0x2e40 (0) 
Child SP IP  Call Site 
003bf5f8 772af8c1 [GCFrame: 003bf5f8] Unknown 
003bf3b4 002b0098 ConsoleApplication1.Program.Main(System.String[])*** WARNING: Unable to verify checksum for ConsoleApplication1.exe 
[c:\ConsoleApplication1\ConsoleApplication1\Program.cs @ 14] 
003bf5f8 6ccb21bb [GCFrame: 003bf5f8] 
+0

Возможный дубликат [Когда метод, подходящий для включения в CLR?] (Http://stackoverflow.com/questions/4660004/when-is-a-method-eligible-to-be-inlined-by -the-clr) –

ответ

2

В сборке релиз Do, ЛТ-компилятор, без сомнения встраивая вызов метода - поэтому номер строки отличается.

+0

, так что сборки релизов также сообщают номера строк в трассировке стека? Я думал, что это происходит только в отладочных сборках. –

+0

@palmsnow: Я считаю, что в debug-сборках больше, чем в версиях релизов, есть еще * отладочная информация, и, очевидно, вам все равно нужно иметь доступ к файлу pdb, но если он дает вам номера строк, то это полезно :) (Во многих местах, где релиз сборки, PDB * не отправлены *, что могло привести к путанице.) –

+0

Хотя вы, вероятно, правы, что компилятор JIT будет встроить вызов, самый верхний стек стека имеет совершенно другой адрес, поэтому я сомневаюсь, что это имеет какое-то отношение к инкрустации. Я считаю, что адрес указывает на код SEH. –

Смежные вопросы