У меня возникли проблемы с пониманием трассировки стека в .net 4. Я получаю разные номера строк для идентичного кода, запущенного в приложении консоли или веб-службе, размещенной в IIS 7.5 (оба используют .net 4). ПрименениеНеверный номер строки трассировки строки внутри блока foreach
консоли:
static void Main(string[] args)
{
try
{
var test = new List<int>() { 1, 2, 3 };
foreach (var root in test)
{
throw new Exception("foobar");
}
}
catch(Exception e)
{
throw;
}
}
При проверке трассировки стека номер строки «е» внутри поймать блока, я получаю «8», которая является то, что я освобожденный (линию броска нового Exception ("Foobar"))
веб-сервис
[WebMethod]
public void Test()
{
try
{
var test = new List<int>() { 1, 2, 3 };
foreach (var root in test)
{
throw new Exception("foobar");
}
}
catch (Exception e)
{
throw;
}
}
В этом случае ситуация становится странной - при проверке номера строки трассировки стека я получаю «7», , который является началом foreach блок. То же самое происходит с классическим для, но если заявление, например, работает ОК.
Любые идеи?
EDIT:
Что касается ответа от машины Узнав о несоосности язя или исполняемой линии и PDB. Если я добавлю лишние строки перед исключением, а некоторые после этого, я все равно получаю подобное поведение. Пример:
[WebMethod]
public string Test()
{
try
{
var test = new List<int>() { 1, 2, 3 };
var a = 1;
var b = 2;
var c = 3;
foreach (var root in test)
{
var d = 4;
var e = 5;
var f = 6;
throw new Exception("foobar" + (new System.Diagnostics.StackFrame(0, true)).GetFileLineNumber());
var g = 7;
}
return null;
}
catch (Exception e)
{
return e.Message + e.StackTrace;
}
}
Здесь e.StackTrace
отчеты линии "12" (foreach
линия) и e.Message
отчеты линии "17", который является правильным.
При проверке части EDIT не происходит реорганизации. Его единственный блок try/catch и исключение в catch имеют номер строки для блока вместо строки внутри цикла. В IIS я работаю на 64-битной (для параметра «Включить 32-разрядные приложения установлено значение false»). Тем не менее - я попытался запустить его непосредственно из VS, поскольку предлагалось машинное обучение, и оно работает правильно! Так выглядит, что это связано с IIS. –
UPDATE - Я устанавливаю для 32-битных приложений значение true, и теперь номера строк верны! –
@PavleGartner Ну, это интересно. Ваш код консоли также разбивается на 64-битный? Убедитесь, что вы * не * присоедините отладчик, который отключает многие из оптимизаций, которые могут вызвать проблему. – Luaan