如何在Classes.pas中调试一个设计时包卸载涉及ThreadProc崩溃的崩溃?

时间:2011-11-29 15:53:15

标签: delphi debugging design-time

我不确定如何追踪以下崩溃:

  1. 在卸载我公司内部使用的Designtime包时会发生这种情况。这是我们的代码,因此修复我们的错误,而不是第三方组件供应商问题。

  2. 它表示涉及一个线程,但由于它发生在Classes.pas中的Function ThreadProc中,我猜它是一个裸的System / RTL线程,甚至没有我应该搜索的TThread类包装器在我们的代码中。 (问题A部分:是这样吗?)

  3. 调用堆栈不包含我的代码,只包含IDE本身,调用堆栈中的基本函数是ntdll.RtlInitializeExceptionChain。

  4. 在某些TThread.Execute方法中调用堆栈访问冲突的示例,该方法显示调试器没有提供有关WHICH线程的详细信息:

     :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 IDE本身崩溃,但我能够继续在我的delphi调试主机实例中查看信息。

    我知道调试设计时包的技术,我正在使用所述技术。也就是说,我有第一个delphi(BDS.exe)副本启动第二个副本,因为包项目已经在其运行参数中设置了主机应用程序编辑框中的主要bds.exe for Delphi XE。 (C:\Program Files (x86)\Embarcadero\RAD Studio\8.0\bin\bds.exe)。因此,当我在调试模式下运行我的包时,它会将自己加载到Delphi IDE中。

    问题部分B是:设置断点的最佳位置是什么,以便我可以看到非TThread线程,以及正在创建的基于TThread的线程?如果无法设置断点,那么如何找到创建线程的代码的替代方法呢?

    更新:我发现在Classes.pas中的函数ThreadProc中读取Thread.Execute的行中设置断点会让我在每个TThread启动时遇到断点。这足以从初始化部分找到由设计时或运行时包启动的线程,但我希望有更低级别的方法来执行此操作。

1 个答案:

答案 0 :(得分:4)

我以下列方式调试了设计时包崩溃:

  1. 如上所述,在主机应用程序中使用运行参数设置Delphi自行运行,路径为c:\path-to-delphi-install\bin\bds.exe

  2. 在System.pas中的ThreadProc函数行中设置断点。

  3. 打开windows.pas,并在30,000-33,000行附近有这样一行:

    function CreateThread; external kernel32 name 'CreateThread';

  4. 使用F8在上面的行上设置断点。现在,当被调试的代码中的任何内容调用Win32函数时,无论是否通过TThread,您都会得到一个断点。

    enter image description here