Исключение NullReferenceException, нет трассировки стека… с чего начать?

#c# #wpf #debugging #pinvoke #winmm

#c# #wpf #отладка #pinvoke #winmm

Вопрос:

У меня есть аудиоприложение WPF.

Иногда (и даже в отладчике) Я вижу, NullReferenceException который не содержит информации о трассировке стека.

Как можно начать отладку такой проблемы?

Некоторая предыстория:

Я использую функции P / Invoking в WinMM.dll , которые включают регистрацию обратного вызова при вызове waveOutOpen

     [DllImport("winmm.dll")]
    public static extern MmResult waveOutOpen(out IntPtr phwo, IntPtr uDeviceID, WaveFmt pwfx, WaveCallbk dwCallback, IntPtr dwInstance, int fdwOpen);
  

Это оказалось трудным для обеспечения стабильности, особенно в тот момент, когда я вызываю waveOutClose и немедленно вызываю waveOutOpen снова (обычно для изменения формата вывода).

Я подозреваю, что проблема может быть связана с вызовами, которые я описывал выше (хотя, обладая столь малыми знаниями, я мог бы полностью отклониться от цели).

Воспроизвести проблему в настоящее время оказывается неуловимым, хотя я могу предоставить сборку пользователю, который довольно последовательно видит эту проблему. Я мог бы попытаться ускорить операции, которые вызывают проблему, до такой степени, чтобы воспроизведение проблемы в отладчике было более достоверным.

Что касается отладчика, я не изменял ни одну из настроек (включая Enable unmanaged code debugging ) или какие-либо Debug -> Exceptions... настройки. Честно говоря, я довольно невежественен в том, что здесь предлагается, поэтому любые подсказки приветствуются.

Как исключение может не иметь трассировки стека? Вы видели это раньше? Помогите!

Комментарии:

1. Да, такого рода вещи происходят слишком часто при работе с неуправляемым кодом. И это полный провал. Лично я хотел бы иметь контрольный список того, что нужно пройти.

2. Контрольный список был бы очень удобен. Кто-нибудь?

Ответ №1:

Самое полезное, что вы можете сделать в отладчике, — это указать ему прерываться при первом случайном исключении (Debug -> Исключения):

Окно VS Exceptions

Это вызовет сбой в отладчике именно в тот момент, когда будет вызван a NullReferenceException , что в значительной степени является лучшим, на что вы можете надеяться при отладке.

Комментарии:

1. Хорошо. Просто нужно, чтобы это произошло в отладчике … ger … grrrr.

2. Большое спасибо! Это перенесено в VS 2015 на случай, если вам интересно.. Отладка-> Windows-> Настройка исключения. Там есть поиск, поэтому, вероятно, проще всего использовать окно поиска для NullReference.