【问题标题】:How can I attach the Delphi debugger to 64-bit IIS 7.5?如何将 Delphi 调试器附加到 64 位 IIS 7.5?
【发布时间】:2011-08-19 11:27:30
【问题描述】:

我在 Windows 7 Pro 64 和 IIS 7.5 上运行 Delphi XE,开发一个 ISAPI 应用程序。 IIS 配置正确(包括允许 32 位代码在 ISAPI 进程中运行)。 ISAPI 进程运行正常。

在 Delphi 中,我试图附加到在 localHost 上运行的 ISAPI 进程以逐步执行我的 ISAPI.dll 代码:运行->附加到进程->InetInfo.exe。

我已经在 Windows XP 和 IIS 5 上做了一千次,但在这个新环境中,我无法附加到 ISAPI 进程。尝试附加时,我在 IDE 中收到错误消息:

无法创建进程 - 不支持请求

这花费了我很多时间——我必须为每一行代码抽出调试字符串,运行应用程序,然后查看我的调试字符串,等等。

为什么我不能附加到 ISAPI 进程?这是 IIS 7.5 配置问题吗?可能与 32/64 位问题有关,因为 IIS 是原生 64 位的,而 Delphi 调试器是 32 位的?

【问题讨论】:

  • 我怀疑你是对的,它是 64 位 IIS 和 32 位调试器的问题。不过,不知道如何告诉您解决它,除非您可以使用 TD 调试信息和 Visual Studio 做一些事情。
  • 不是很有帮助.....但是你不能只在 32 位 VM 中运行 IIS 吗?
  • 确保你完全理解在 IIS 6 中首次引入的工作进程隔离模式(当然对于 IIS 7 及更高版本)。那你应该知道这么多年后附加到inetinfo.exe是错误的。
  • @Lex Li - 在我的 XP 开发机器上使用的 IIS 5(正如我在问题中提到的)中的 inetinfo 从来没有任何问题。由于 IIS 6 仅在 Server 2003 上可用,我认为我从未通过 IIS 6 进行过调试,我根本没有提及。如果 IIS 6 中的设计发生了更改,排除了附加到 inetinfo,那是另一回事。那么解决方案是什么?如何连接到运行我的 DLL 的特定进程?进程如何命名? Tnx。
  • @Mikey,我确实在下面提供了一个答案,其中包含指向流程模型的链接。 w3wp.exe 是您应该附加到的那个。

标签: delphi 64-bit iis-7.5 delphi-xe isapi


【解决方案1】:

您可以在 IIS 7.5 的高级应用程序池设置中将“启用 32 位应用程序”设置为 true,从而在 x64 位计算机上调试您的 32 位 ISAPI dll。

在 Delphi 中,您使用参数“-debug”指定“C:\Windows\System32\inetsrv\w3wp.exe”作为宿主应用程序。以管理员身份启动 Delphi IDE,然后离开。如果您需要更多地控制 w3wp 的启动方式,您可以使用命令 C:\Windows\System32\inetsrv\w3wp.exe -?

希望这会有所帮助!

【讨论】:

  • 嗯 - 谢谢 - 这个问题是在一年前回答的......当然它必须是一个 32 应用程序,但感谢您的帮助。
【解决方案2】:

在这里学习,http://blogs.msdn.com/b/david.wang/archive/2006/06/21/isapi-filter-and-the-iis6-process-model.aspx

为了清楚起见,在 iis 工作进程隔离模式下,w3wp.exe 是加载您的 isapi 过滤器的进程,因此您应该附加到它而不是 inetinfo.exe。

【讨论】:

    【解决方案3】:

    您可以使用以下工具在 IIS 7.5 下调试您的 Delphi ISAPI Web 应用程序 http://www.eggcentric.com/ISAPIDebug.htm。 (您需要设置 ISAPIFwd.ini 文件)

    【讨论】:

    • 感谢您的链接 - 看起来我可以使用,我会检查一下 - 但我确信让它在 IIS 7.5 中工作会很痛苦。 .
    • 不 - 这很简单 - 只需按照说明操作即可。我用它来调试Windows 7、IIS 7.5下的一些ISAPI应用程序。
    【解决方案4】:

    如果 IIS 64 位使用的是 32 位模块的 ISAPI.DLL,则它必须使用 32 位加载程序进程。 您可以使用ProcessExplorer 查找正在加载您的 ISAPI.DLL 的进程并将 Delphi 附加到该进程。

    【讨论】:

    • 这是因为,这一次,MS 没有提供允许在 64 位和 32 位模块之间进行通信的 thunking 机制 - 当人们从 16 位世界迁移到 32 位世界时(很久以前),他们这样做了。跨度>
    【解决方案5】:

    【讨论】:

    • 谢谢 - 我已经注册了测试计划!但这现在没有多大帮助。无法在我的生产代码中使用 beta 64 位编译器。
    猜你喜欢
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    • 2014-02-04
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    • 2010-09-17
    • 2011-06-10
    相关资源
    最近更新 更多