0

有没有我可以为基于 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 的还是与网络相关的,都可以告诉我特定会话访问特定网络文件的时刻。这至少可以帮助我识别与用户遇到错误的时刻相关的事件。

4

1 回答 1

4

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

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

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

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

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

于 2015-02-12T06:48:57.843 回答