【问题标题】:Delphi errors on Remote Desktop Server远程桌面服务器上的 Delphi 错误
【发布时间】:2015-04-12 16:52:42
【问题描述】:

我是否可以为基于 Delphi 的 EXE 启用任何日志记录/跟踪工具,而无需访问 Delphi 代码,只需要编译的 EXE 和相关的 DLL?

这就是我需要它的原因:我们的 Windows 2012 远程桌面服务器(以前称为终端服务器)的一些用户会定期遇到 C0000006 外部异常错误,但仅适用于从共享位置访问的基于 Delphi 的第三方应用程序在网络上(即不是 RDS 服务器的本地)。办公室中的本地 PC 用户以相同的方式访问相同的文件没有问题。如果将EXE复制到RDS服务器,RDS用户不会遇到问题;然而,由于应用程序的一些限制,这只是一个测试,而不是解决方案。

这是关键:它只发生在 Mac 上运行的 RDS 客户端(大约 6 个用户),而不是 Windows RDS 客户端(大约 15 个用户)。

我已经在 MS 终端服务器论坛上发布了一个详细但尚未回答的问题。我的研究表明,这种行为并不是什么新鲜事。

  1. Windows 2000 修复了一个问题,该问题与 Windows 混淆了哪个客户端会话打开了特定程序有关。
  2. 即使在最近的 Windows 2008 中,RDS 上也存在特定于 Delphi 的网络访问问题,这与它按需加载部分 EXE/DLL 的方式有关,而不是在打开应用程序时加载。我推断,虽然症状相同,但根本原因肯定有所不同。

因此,在等待第三方开发人员的预测时,我正在尝试找出是否有任何方法可以设置活动跟踪,无论是特定于 Delphi 的,还是可能与网络相关的,都可以告诉我特定会话访问特定网络文件的时刻。这至少可以帮助我识别与用户遇到错误的时刻相关的事件。

【问题讨论】:

  • AFAIK,如果 EXE 是在 release 模式下构建的,那么调试信息很可能没有用它编译。虽然可能有一些我不知道的神奇工具可以进入那种类型的细节,但可能是在组装级别。即使 EXE 确实包含调试信息,如果不只是在调试模式下运行原始源代码,实际执行调试仍然很困难。除非您知道汇编,否则最佳选择是调试原始源代码。当然,除非应用程序是用记录器设计的,在这种情况下这是另一回事。
  • 如果您对监控文件或 I/O 访问感兴趣,那么我强烈建议您尝试使用 Sysinternals (technet.microsoft.com/en-us/sysinternals/bb896645.aspx) 的 Prcoess Monitor。现在我必须承认我还没有尝试在 RDS 客户端上使用它,但我仍然认为它应该可以工作。

标签: delphi terminal-server


【解决方案1】:

您不需要任何特定于程序的日志记录,因为错误更为根本,并且与任何编程语言无关。这是一个原生 API 错误代码,一个 NTSTATUS 值,特别是 STATUS_IN_PAGE_ERROR

这些是低级错误,表明虚拟内存系统存在根本问题。当物理内存不可用时,虚拟内存页面可以存储在磁盘上。对于可执行模块,如果系统知道一个页面保存在磁盘上,并且该页面可以被丢弃,那么系统将这样做,因为知道该页面可以稍后检索。有时页面甚至从未加载到内存中。可执行模块按需调入。

STATUS_IN_PAGE_ERROR 错误表示虚拟内存系统未能将页面引入内存。当可执行文件是本地的时,这种情况很少发生。当可执行文件是远程的时很少见。

处理此问题的标准方法是将IMAGE_FILE_NET_RUN_FROM_SWAP PE 标志添加到任何远程运行的模块。然后发生的事情是加载器首先将整个文件复制到交换,在本地保存,然后从那里加载可执行文件。因为交换文件是本地的,所以不太可能出现页面错误。您可以自己应用 PE 标志来进行试验。这似乎可行,因为您已经评论说,当文件被复制到本地时,问题就解决了。

似乎有系统范围的策略可以使所有远程可执行文件都发生这种情况。

【讨论】:

  • 大卫:谢谢。设置该标志是我可以做的事情,而不是作为 Delphi 开发人员吗?但还要注意,在托管 EXE 的 LAN 中的 PC 上运行应用程序时不会发生这种情况,只有在该 LAN 中的终端服务器上运行它们的用户才会发生这种情况,即使所有人都从同一网络位置访问 EXE。然后它只影响基于 Delphi 的应用程序,并且只影响那些使用 Mac RDP 客户端的用户。我的最终目标不是试图找到解决方法;它是在 Delphi 和 Mac RDP 客户端的组合中确定是什么导致了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
相关资源
最近更新 更多