Я не уверен, как отследить следующее падение:
Это происходит при выгрузке пакета Designtime, который используется в моей компании.Это наш код, поэтому это наша ошибка, которую нужно исправить, а не проблема сторонних поставщиков компонентов.
Похоже, что поток задействован, но поскольку это происходит в функции ThreadProc вClasses.pas, я предполагаю, что это чистый поток System / RTL без даже оболочки класса TThread, которую я должен искать в нашем коде.(Вопрос, часть A: так ли это?)
Стек вызовов не содержит ни одного моего кода, кроме самой 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 из его раздела инициализации, но я надеюсь, что существует способ еще более низкого уровня, чтобы сделать это.