Я только что портировал несколько наших собственных COM-надстроек Outlook с Delphi 2007 на Delphi 2009 и теперь у меня возникают некоторые действительно странные ошибки (прежде чем вы спросите: ни одна из которых, кажется, не имеет никакого очевидного отношения к обработке строк) Например, модальные диалоги, которые вешают Outlook, когда кто-то пытается вызвать их во второй раз (первый раз, когда все выглядит нормально), но только тогда, когда они вызываются из одного определенного обработчика событий, а не когда делают то же самое где-то еще. Когда я прослеживаю ошибку до определенной строки кода и закомментирую эту строку или заменю ее другим кодом с тем же эффектом (например, путем копирования кода, который в противном случае был бы вызван через функцию непосредственно на вызывающий сайт), появится ошибка уйти - обычно только для того, чтобы повторить пару (одинаково неприметных) заявлений позже.
При запуске этого в отладчике Delphi я вижу, что замораживаниям часто предшествуют нарушения прав доступа в GetMem.inc
. По крайней мере, все эти проблемы воспроизводимы на 100% ...
Излишне говорить, что у нас не было ни одной из этих проблем при компиляции этих надстроек в Delphi 2007.
Теперь я в растерянности. Я знаю, что мне просто повезло, но хотя я считаю себя довольно опытным программистом (хотя в основном в нишевых областях), мне никогда раньше не приходилось сталкиваться с этим классом ошибок. Как следует из названия этого вопроса, я даже не знаю, с чего начать. Я могу шагать по коду сколько угодно, но бесконечные ассемблерные выражения ничего не значат для меня, и при этом я не обладаю навыками эффективного использования представления CPU.
Более того, я даже точно не знаю, является ли это проблемой с моим собственным кодом для начала (на самом деле я склонен сомневаться в этом в этом случае). Мы широко используем ряд сторонних библиотек (например, JCL, ADX, Redemption). В частности, ADX все еще маркирует свою бета-версию поддержки Delphi 2009.
Я также пытался использовать FastDMM FullDebugMode и действительно обнаружил ряд ошибок в ADX (например, блоки, которые были изменены после освобождения), но все это также происходит, когда я компилирую с Delphi 2007, поэтому он не все же кажется обязательным, что в конечном итоге это является причиной наблюдаемой регрессии.
Итак, как мне справиться с этим? - или еще лучше: где я могу найти хорошие ресурсы для изучения того, как справиться с этим? например учебные пособия по использованию представления CPU или эффективной интерпретации и действию на основе отчетов, выпущенных FastMM? Это правильные инструменты на всех? Куда еще мне обратиться?
Добавление:
Какие типы кода мне следует с подозрением относиться в этом контексте? Какой код даже может вызвать такой хаос в памяти? Единственные места, где я могу думать о том, где мой код выполняет что-либо удаленно приближающееся к явным манипуляциям с памятью, - это резервирование некоторого буферного пространства при подготовке вызова WinAPI. Также имейте в виду, что весь мой код идентичен между версиями Delphi 2007 и Delphi 2009, и в версии Delphi 2007 таких проблем нет.
Обновление:
С некоторой вероятностью проблема, которая побудила меня опубликовать этот вопрос, теперь решена. Смотрите мой собственный ответ ниже.