#winapi #richedit
Вопрос:
В своем приложении я использую элемент управления RichEdit ( RICHED20.DLL
) с подсветкой синтаксиса, реализованной поверх него. Для правильной работы требовалось довольно много кода. Внутри все хранится в формате RTF и переформатируется на лету. Этот код стабильно работает уже более 10 лет во множестве различных сред.
Однако недавно одному пользователю удалось заморозить мое приложение. Ему даже удалось придумать описание шагов, которые можно использовать для четкого воспроизведения замораживания. Таким образом, я смог отладить его с помощью WinDbg и получил отчет о том, что он зависает CTxtEdit::TxSendMessage
. Вот что говорит WinDbg, когда я прерываю программу, как только она зависает, и делаю !analyze -hang
в WinDbg:
Вероятно, вызвано : RICHED20.DLL ( riched20!CTxtEdit::TxSendMessage 132e )
Так это похоже на ошибку в элементе управления RichEdit? Есть ли что-нибудь еще, что я мог бы здесь отладить? Я действительно не знаю, где искать, потому что зависания, по-видимому, нет в моем приложении. Я уже проверил и убедился, что ни WndProc
мой элемент управления RichEdit, ни элемент WndProc
управления верхнего уровня не получают никаких сообщений во время зависания. Это действительно кажется зависшим, RICHED20.DLL
так что для меня это похоже на ошибку управления RichEdit.
Может ли это быть так, или что еще я мог бы попытаться отладить проблему дальше? У меня здесь нет идей.
Комментарии:
1. нужна дополнительная информация — полный дамп трассировки стека, как минимум, и т.д. Или, лучше всего, иметь двоичное приложение и описание шагов, которые можно использовать для четкого воспроизведения замораживания
2. да, я вижу. это бесконечный цикл и зависает (поток работает все время). действительно ошибка в RICHED20.DLL . стек вызовов-это pastebin.com/ucntYytx нужно некоторое время, чтобы посмотреть более подробно, где ошибка
3. ошибка именно в функции
long CTxtPtr::FindEOP(long,long *)
— код никогда не выходит из нее. бесконечно кручусь здесь, зовуunsigned short const * CTxtPtr::GetPchReverse(long amp;,long *)
. это не ваша ошибка, но RICHED20.DLL4. я подробно исследую это. внутри функции
FindEOP
(она называется какFindEOP(cchMax = tomBackward, 0)
) существует циклwhile(cchMax > 0)
и по ошибке — функция никогда не выходит из этого цикла.cchMax
все время имеет значениеtomForward = -tomBackward
> 0 и не обновляется внутри цикла. вы не можете исправить это самостоятельно. но я открываю ваш документ в wordpad.exe который используется Msftedit.dll и здесь нет ошибки5. @Andreas: его очень легко заменить. 1) Измените класс окна для элемента управления richedit в своем диалоговом ресурсе на
RichEdit50W
или создайте его , используя это имя класса. 2) ПозвонитеLoadLibrary(L"msftedit.dll");
куда-нибудь во время инициализации процесса, прежде чем появится окно с расширенной информацией. Все остальное должно быть обратно совместимо.