Как отладить сбой при выгрузке пакета designtime, вызвавший сбой в ThreadProc в Classes.pas? - PullRequest
3 голосов
/ 29 ноября 2011

Я не уверен, как отследить следующее падение:

  1. Это происходит при выгрузке пакета Designtime, который используется в моей компании.Это наш код, поэтому это наша ошибка, которую нужно исправить, а не проблема сторонних поставщиков компонентов.

  2. Похоже, что поток задействован, но поскольку это происходит в функции ThreadProc вClasses.pas, я предполагаю, что это чистый поток System / RTL без даже оболочки класса TThread, которую я должен искать в нашем коде.(Вопрос, часть A: так ли это?)

  3. Стек вызовов не содержит ни одного моего кода, кроме самой IDE, а базовой функцией в стеке вызовов является ntdll.RtlInitializeExceptionChain.

пример стека вызовов о нарушении прав доступа в каком-либо методе TThread.Execute, который показывает, что отладчик не дает никаких сведений о том, какой поток задействован:

 :7599b9bc KERNELBASE.RaiseException + 0x58
 :516b4965 ; c:\program files (x86)\embarcadero\rad studio\8.0\bin\exceptiondiag150.bpl
 :5003b058 NotifyNonDelphiException + $1C
 :77be6a8b ; ntdll.dll
 :77bb0143 ntdll.KiUserExceptionDispatcher + 0xf
 rtl.Classes.ThreadProc($CB9ED70)
rtl.System.ThreadWrapper($403E910)
:75fb339a kernel32.BaseThreadInitThunk + 0x12
:77bd9ed2 ntdll.RtlInitializeExceptionChain + 0x63
:77bd9ea5 ntdll.RtlInitializeExceptionChain + 0x36

Когда я пытаюсьдля просмотра информации о потоке вторая среда разработки Delphi, которая является моим целевым исполняемым файлом, сама аварийно завершает свою работу, но я могу продолжать просматривать информацию в моем экземпляре узла отладки delphi.

Мне известны методы отладки пакетов времени разработки,и я использую упомянутые методы.То есть у меня есть первая копия delphi (BDS.exe), запускающая вторую копию, поскольку проект пакета установил в своих параметрах запуска в поле редактирования Host Application основной bds.exe для Delphi XE.(C:\Program Files (x86)\Embarcadero\RAD Studio\8.0\bin\bds.exe).Таким образом, когда я запускаю свой пакет в режиме отладки, он загружается в интегрированную среду разработки Delphi.

Вопрос, часть B: Как лучше всего установить точку останова, чтобы я мог видеть потоки не-TThread, а такжеTThread-основанные темы создаются?Если нет способа установить точку останова, то как насчет альтернативных способов определения того, какой код создает потоки?

Обновление: я обнаружил, что установка точки останова в строке, которая читает Thread.Execute, в функцииThreadProc, в Classes.pas, получает мне точку останова при каждом запуске TThread.Этого достаточно, чтобы найти потоки, запущенные пакетом designtime или runtime из его раздела инициализации, но я надеюсь, что существует способ еще более низкого уровня, чтобы сделать это.

1 Ответ

4 голосов
/ 06 декабря 2011

Я отладил аварийное завершение пакета designtime следующим образом:

  1. Как уже отмечалось выше, настройте Delphi для запуска самого себя с использованием параметров запуска в хост-приложении, путь к которомуc:\path-to-delphi-install\bin\bds.exe.

  2. Установить точку останова в строке в функции ThreadProc в System.pas.

  3. Открыть windows.pas и вокруг строки30 000-33 000 есть такая строка:

    function CreateThread; external kernel32 name 'CreateThread';

Установите точку останова на строке выше с помощью F8.Теперь, когда что-либо в отлаживаемом коде вызывает эту функцию Win32, через TThread или нет, вы получите точку останова.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...