Ничего не могу понять.
Появляется при отладке этот exception (User Breakpoint).
Приложение mfc + com (IWebBrowser).
При проходе по шагам, вылетает в
CDialog.DoModal в RunModalLoop.
Если не в отладке, то все работает на ура
в WinXP и ME (тестировал) а вот в Win2000
вылетает ошибка (память не может быть записанна или память не может быть прочтена).
Как отловить это?
Здравствуйте, 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 >>
Здравствуйте, Блудов Павел, Вы писали:
БП>Здравствуйте, 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 не сказанно, что она это делает, вот я и подавал ей не тот указатель.