Unhandled exception in ntdll.dll! Как отловить?
От: Rcorp Россия  
Дата: 04.12.04 16:18
Оценка:
Ничего не могу понять.
Появляется при отладке этот exception (User Breakpoint).
Приложение mfc + com (IWebBrowser).
При проходе по шагам, вылетает в
CDialog.DoModal в RunModalLoop.
Если не в отладке, то все работает на ура
в WinXP и ME (тестировал) а вот в Win2000
вылетает ошибка (память не может быть записанна или память не может быть прочтена).
Как отловить это?
Re: Unhandled exception in ntdll.dll! Как отловить?
От: Блудов Павел Россия  
Дата: 06.12.04 02:33
Оценка:
Здравствуйте, Rcorp, Вы писали:

R>Если не в отладке, то все работает на ура

Возможно, это из-за того, что при отладке под NT+ используется более другая куча, чем при "обычном" прогоне.
В результате происходит следующее:
Под отладчиком освобождённая память прописывается каким-нибудь 0xBAADF00D, а без него просто помечается как свободная.
Хуже всего то, что ошибка может быть не в Вашем коде, а где-нибудь в mshtml.dll

Под отладчиком, но не по шагам работает?
Сколько процессоров? Включена гиперниточность? Дело может быть в банальной синхронизации.
Вот пример:
void BadFunc()
{
    int nStackVar = 0;
    ::CreateThread(OtherFunc, ..., &nStackVar);
}

DWORD WINAPI OtherFunc(LPVOID pvUserArg)
{
    int nVar = *(int*)pvUserArg;
}


При пошаговом проходе управление сначала покинет функцию BadFunc, а потом попадет в OtherFunc.
В nVar попадет мусор.

Без пошагового прогона, но при наличии второго процессора или гиперниточности выполнение OtherFunc начнется до того,
как завершится вызов CreateThread. В nVar с большой долей вероятности будет нужное значение.

--Павел.
... << RSDN@Home 1.1.4 beta 2 >>
Re[2]: Unhandled exception in ntdll.dll! Как отловить?
От: Rcorp Россия  
Дата: 06.12.04 07:03
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

БП>Здравствуйте, Rcorp, Вы писали:


R>>Если не в отладке, то все работает на ура

БП>Возможно, это из-за того, что при отладке под NT+ используется более другая куча, чем при "обычном" прогоне.
БП>В результате происходит следующее:
БП>Под отладчиком освобождённая память прописывается каким-нибудь 0xBAADF00D, а без него просто помечается как свободная.
БП>Хуже всего то, что ошибка может быть не в Вашем коде, а где-нибудь в mshtml.dll

БП>Под отладчиком, но не по шагам работает?

БП>Сколько процессоров? Включена гиперниточность? Дело может быть в банальной синхронизации.
БП>Вот пример:
БП>
БП>void BadFunc()
БП>{
БП>    int nStackVar = 0;
БП>    ::CreateThread(OtherFunc, ..., &nStackVar);
БП>}

БП>DWORD WINAPI OtherFunc(LPVOID pvUserArg)
БП>{
БП>    int nVar = *(int*)pvUserArg;
БП>}
БП>


БП>При пошаговом проходе управление сначала покинет функцию BadFunc, а потом попадет в OtherFunc.

БП>В nVar попадет мусор.

БП>Без пошагового прогона, но при наличии второго процессора или гиперниточности выполнение OtherFunc начнется до того,

БП>как завершится вызов CreateThread. В nVar с большой долей вероятности будет нужное значение.

БП>--Павел.


Спасибо, уже отловил.
Было как раз в mshtml.dll.
Эта зараза чистила память после вызова моей IDocHostUIHandler->GetHostInfo.
В MSDN не сказанно, что она это делает, вот я и подавал ей не тот указатель.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.