Почему исключения ошибок ссылки на объект в .net не говорят мне, какой объект был нулевым? - PullRequest
11 голосов
/ 07 января 2011

Возможно, задание вопроса выдает мое отсутствие знаний о процессе, но, опять же, нет лучшей причины спрашивать!

Отслеживание этих данных может быть неприятным, потому что следы стека могут помочь мне узнать, с чего начать поискно не какой объект был нулевым.

Что здесь происходит под капотом?Это потому, что имена переменных не включены в исполняемый файл?

Ответы [ 3 ]

5 голосов
/ 07 января 2011

.NET-код, созданный с полной оптимизацией и без отладочной информации: имена локальных переменных исчезли, некоторые локальные переменные могли быть полностью исключены.

.NET-код, созданный с полной оптимизацией + PDB (или полная отладка): большинство имен локальных переменных сохранены, некоторые локальные переменные, возможно, были исключены

Нет оптимизаций + нет отладочной информации: имена локальных переменных пропали.

И затем мы должны учесть, что все, что вы 'Работа с ним может вообще не входить в локальную переменную - это могло быть результатом предыдущего вызова функции, при котором вы связываете вызов новой функции.

1 голос
/ 07 января 2011

В основном вы ответили на свой вопрос.Когда ваш код скомпилирован, он трансформируется в промежуточный язык (IL).В IL нет имен переменных, как в вашем коде, аргументы вызываемого метода помещаются в стек перед вызовом метода, а аргументы методов current и локальные переменные ссылаются на их позицию.Я считаю, что это потому, что эта структура помогает компилятору JIT генерировать код.

Файл символов pdb хранит отображение между сгенерированным IL и вашим кодом.Он используется, чтобы сказать вам, к какой строке в вашем коде относится каждый вызов метода в стеке вызовов.Возможно, информация, хранящаяся здесь, недостаточно детальна, чтобы сказать, какая переменная равна нулю, или, возможно, она считалась слишком дорогой с точки зрения срока действия, чтобы сделать это.В любом случае, если вы позволили компилятору оптимизировать сгенерированный IL, может больше не быть однозначного соответствия между переменными в IL и переменными в вашем коде.

Надеюсь, это поможет, Роб

0 голосов
/ 07 января 2011

Нет «идентификатора объекта». .NET не может сказать, что «объект с идентификатором xxxx равен нулю».

Вы научитесь не делать этих ошибок, не волнуйтесь. Просто разбейте ваши выражения на более мелкие части, и вы найдете, какие объекты вы забыли инициализировать. Вы научитесь инициализировать их в этом сценарии, и через некоторое время этот случай больше не повторится.

...