远程桌面服务器上的Delphi错误

时间:2015-02-12 04:23:00

标签: delphi terminal-server

我是否可以为基于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的方式有关,而不是打开应用程序时的一次。我推断,虽然症状相同,但根本原因必须有所不同。
  3. 所以,当我等待第三方开发人员的预测时,我试图找出是否有任何方法可以建立一系列活动,无论是特定于Delphi还是甚至可能与网络相关,告诉我特定会话访问特定网络文件的时刻。这至少可以帮助我识别与用户遇到错误的时刻相关的事件。

1 个答案:

答案 0 :(得分:4)

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

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

STATUS_IN_PAGE_ERROR错误表示虚拟内存系统无法将页面带入内存。当可执行文件是本地文件时,失败很少见。可执行文件远程时少见。

处理此问题的标准方法是将IMAGE_FILE_NET_RUN_FROM_SWAP PE标志添加到任何远程模块。然后,加载程序首先将整个文件复制到交换,在本地保存,然后从那里加载可执行文件。因为交换文件是本地的,所以不太可能有页面出错。您可以自己申请PE标志进行试用。它似乎可能有效,因为您已经评论过将文件复制到本地时问题得到解决。

有可能存在系统范围的策略来实现所有远程可执行文件。