我是否可以为基于Delphi的EXE启用任何日志/跟踪工具,而无需访问Delphi代码,只需编译EXE和相关的DLL?
以下是我需要它的原因:我们的Windows 2012远程桌面服务器(以前称为终端服务器)的某些用户会定期遇到C0000006外部异常错误,但仅适用于从共享位置访问的第三方基于Delphi的应用程序在网络上(即不是RDS服务器的本地)。办公室中的本地PC用户以相同的方式访问相同的文件没有问题。如果将EXE复制到RDS服务器,则RDS用户不会遇到此问题;然而,由于应用程序的某些限制,这只是一个测试,而不是解决方案。
以下是踢球者:它只发生在Mac上运行的RDS客户端(大约6个用户),而不是Windows RDS客户端(大约15个用户)。
我已在MS终端服务器论坛上发布了一个详细但尚未回答的问题。我的研究表明,这种行为并不是什么新鲜事。
所以,当我等待第三方开发人员的预测时,我试图找出是否有任何方法可以建立一系列活动,无论是特定于Delphi还是甚至可能与网络相关,告诉我特定会话访问特定网络文件的时刻。这至少可以帮助我识别与用户遇到错误的时刻相关的事件。
答案 0 :(得分:4)
您不需要任何特定于程序的日志记录,因为错误更基本,与任何编程语言无关。这是本机API错误代码,NTSTATUS值,特别是STATUS_IN_PAGE_ERROR
。
这些是低级错误,表明虚拟内存系统存在根本问题。当物理内存不可用时,虚拟内存页面可以存储在磁盘上。对于可执行模块,如果系统知道页面保存在磁盘上,并且该页面可以被丢弃,则系统将知道该页面可以在以后检索。有时页面甚至从未加载到内存中。可执行模块按需分页。
STATUS_IN_PAGE_ERROR
错误表示虚拟内存系统无法将页面带入内存。当可执行文件是本地文件时,失败很少见。可执行文件远程时少见。
处理此问题的标准方法是将IMAGE_FILE_NET_RUN_FROM_SWAP
PE标志添加到任何远程模块。然后,加载程序首先将整个文件复制到交换,在本地保存,然后从那里加载可执行文件。因为交换文件是本地的,所以不太可能有页面出错。您可以自己申请PE标志进行试用。它似乎可能有效,因为您已经评论过将文件复制到本地时问题得到解决。
有可能存在系统范围的策略来实现所有远程可执行文件。