Сообщение об ошибке исключения с неправильным номером строки

Когда на веб-странице Asp.Net возникает исключение, отображается сообщение об ошибке с полной трассировкой стека.

Пример ниже:

Трассировка стека:
IndexOutOfRangeException: индекс находился за пределами массива.

MyNameSpace.SPAPP.ViewDetailsCodeBehind.LoadView () +5112 MyNameSpace.SPAPP.ViewDetailsCodeBehind.Page_Load (отправитель объекта, EventArgs e) +67
System.Web. Util.CalliHelper.EventArgFunctionCaller (IntPtr fp, Object o, Object t, EventArgs e) +13
System.Web.Util.CalliEventHandlerDelegateProxy.Callback (отправитель объекта, EventArgs e) +43
System.Web. UI.Control.OnLoad (EventArgs e) +98
... ...

Проблема в том, что отображаемый номер строки не соответствует строке в моем коде, вызвавшей исключение.
В приведенном выше примере стек показывает номер строки 5111, но в моем коде за файлом .cs всего 250 строк!

Страница aspx хранится на сайте SharePoint, а сборка с исходным кодом развернута в GAC. Кроме того, я скомпилировал в режиме отладки.

С учетом приведенных выше настроек, как я могу узнать, какая строка в моем коде вызвала исключение?



Разъяснение, указанное strelokstrelok:

В режиме выпуска число перед исключением НЕ является строкой кода. Вместо этого это смещение к собственному скомпилированному коду, который не имеет никакого значения для людей. Подробнее об этом здесь: http://odetocode.com/Blogs/scott/archive/2005/01/24/963.aspx

В режиме отладки файл PDB автоматически сопоставляет смещение собственного кода с вашей строкой .cs в коде, и отображаемое число БУДЕТ соответствующей строкой в ​​коде.


person Henrique Zacchi    schedule 29.01.2009    source источник
comment
.. конечно, когда это номер строки, он явно говорит об этом: ..... \ Areas \ Store \ Models \ CheckoutModel.cs: line 158   -  person Simon_Weaver    schedule 16.12.2010


Ответы (3)


Эти числа НЕ являются номерами строк. В режиме выпуска трассировка стека содержит смещения в собственном скомпилированном коде вместо номеров строк. Подробнее об этом можно прочитать здесь: http://odetocode.com/Blogs/scott/archive/2005/01/24/963.aspx

Единственный способ получить номера строк в трассировке стека - это создать код в режиме отладки с доступными файлами PDB.

person Strelok    schedule 02.02.2009

Ваш код за файлом не является полным классом, это только часть, которая используется, когда класс в целом компилируется ASP.NET. Чтобы найти то, что действительно находится в этой строке, взгляните на скомпилированный класс / сборку с помощью такого инструмента, как Reflector.

person matt b    schedule 29.01.2009
comment
Я могу ошибаться здесь, но AFAIK, в ASP.Net стек всегда дает вам правильную строку, однако в Asp.Net + SharePoint это не похоже. В любом случае, я использую отражатель .Net red-gate, но я не смог найти ничего, что помогло бы мне определить строку кода, вызвавшую исключение. - person Henrique Zacchi; 02.02.2009
comment
Это неверно. Эти числа НЕ являются номерами строк и даже не являются смещениями в IL. - person Strelok; 02.02.2009

Возможно, текущий код - это не то, что вы видите на экране. Кто-то из помощников мог его отремонтировать за вас. :)

person Szundi    schedule 02.02.2009
comment
не забудьте получить последний код из системы контроля версий, если вы работаете в команде +1 - person Dean; 03.03.2014