标签: win64

线程关闭期间Win64 Delphi RTL中的内存泄漏?

很长一段时间我都注意到我的服务器应用程序的Win64版本泄漏了内存.虽然Win32版本在相对稳定的内存占用情况下运行良好,但64位版本使用的内存会定期增加 - 可能是20Mb /天,没有任何明显的原因(不用说,FastMM4没有报告任何内存泄漏) .32位和64位版本的源代码相同.该应用程序是围绕Indy TIdTCPServer组件构建的,它是一个连接到数据库的高度多线程服务器,该数据库处理由Delphi XE2制作的其他客户端发送的命令.

我花了很多时间来查看自己的代码并试图理解为什么64位版本泄露了如此多的内存.最后我使用了专门用于跟踪DebugDiag和XPerf等内存泄漏的MS工具,看起来Delphi 64位RTL中存在一个基本缺陷,每次线程从DLL分离时都会导致某些字节泄露.对于必须在不重新启动的情况下全天候运行的高度多线程应用程序,此问题尤其重要.

我用一个由主机应用程序和库组成的非常基本的项目重现了这个问题,这两个项目都是用XE2构建的.DLL与主机应用程序静态链接.主机应用程序创建只调用虚拟导出过程并退出的线程:

这是库的源代码:

library FooBarDLL;

uses
  Windows,
  System.SysUtils,
  System.Classes;

{$R *.res}

function FooBarProc(): Boolean; stdcall;
begin
  Result := True; //Do nothing.
end;

exports
  FooBarProc;
Run Code Online (Sandbox Code Playgroud)

宿主应用程序使用计时器来创建一个只调用导出过程的线程:

  TFooThread = class (TThread)
  protected
    procedure Execute; override;
  public
    constructor Create;
  end;

...

function FooBarProc(): Boolean; stdcall; external 'FooBarDll.dll';

implementation

{$R *.dfm}

procedure THostAppForm.TimerTimer(Sender: TObject);
begin
  with TFooThread.Create() do
    Start;
end;

{ TFooThread }

constructor TFooThread.Create;
begin
  inherited Create(True);
  FreeOnTerminate := True;
end;

procedure TFooThread.Execute;
begin
  /// …
Run Code Online (Sandbox Code Playgroud)

delphi memory-leaks win64 delphi-xe2

36
推荐指数
1
解决办法
2530
查看次数

为什么在64位Windows中运行时2 GB内存限制?

我是开发Delphi应用程序的团队的成员.内存需求量很大.500 MB是正常的,但在某些情况下它会出现内存异常.在这种情况下分配的内存通常在1000 - 1700 MB之间.

我们当然需要64位编译器,但现在不会发生(如果它发生,我们也必须转换为unicode,但这是另一个故事......).

我的问题是为什么在64位环境中运行时每个进程有2 GB的内存限制.指针是32位,所以我认为4 GB是正确的限制.我使用Delphi 2007.

编辑: 所以如果我使用以下方法在Delphi中设置IMAGE_FILE_LARGE_ADDRESS_AWARE标志:

{$SetPeFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
Run Code Online (Sandbox Code Playgroud)

并在Windows Server 2003 x64上运行生成的Exe文件,然后该应用程序可以处理4 GB?

  • 我应该在boot.ini中设置/ 3GB开关吗?
  • 我们尝试了这个但是在32位Windows Server 2003上它似乎限制了Windows资源.在日志中使用GDIError的"Out of memory"有更多例外.但是在64位操作系统中运行时可能会消失吗?

delphi win64 delphi-2007

31
推荐指数
3
解决办法
1万
查看次数

如何在Windows上并排安装Python 2.7.3 32位和64位

我有Windows Vista 64.

我有一些项目需要Python 2.7.3 64位和其他需要Python 2.7.3 32位(因为一些扩展不能在64位工作).

如何阻止Python 2.7.3 MSI安装程序(32或64 bot)删除其他版本.

并排使用Python 2.7.2为我工作没有问题.

python win64

30
推荐指数
1
解决办法
3万
查看次数

GWL_USERDATA用于存储对象指针的替代方法是什么?

在我工作的Windows应用程序中,我们有一个直接位于Win32上方的自定义框架(不要问).当我们创建一个窗口时,我们通常的做法是将this窗口的用户数据区域放入SetWindowLong(hwnd, GWL_USERDATA, this),这样我们就可以进行类似MFC的回调或紧密集成WndProc.问题是这不适用于Win64,因为LONG只有32位宽.什么是解决这个问题的更好的解决方案适用于32位和64位系统?

windows winapi win64

27
推荐指数
2
解决办法
2万
查看次数

rundll32.exe等效于64位DLL

是否有相当于rundll32.exe用于调用64位DLL?

win64 rundll32

18
推荐指数
1
解决办法
2万
查看次数

18
推荐指数
4
解决办法
2万
查看次数

64位Windows API:C/C++"DWORD"的大小是多少?

我只安装了32位Windows,所以我自己无法验证.

如果我理解正确,在Microsoft API的各个地方使用的DWORD是参考原始的16位字,并且与当前的硬件架构无​​关?

所以看起来是32位的DWORD,即使我最终编译并链接我的应用程序以在64位Windows中运行,仍将保持32位?或者DWORD会变成128位宽吗?

windows winapi win64 32bit-64bit visual-c++

17
推荐指数
1
解决办法
8538
查看次数

你如何编译OpenSSL for x64?

按照INSTALL.W64中的说明操作后,我遇到两个问题:

  • 代码仍写入"out32"文件夹.我需要能够在我的工作站上链接到32位和64位版本的库,所以我不希望64位版本破坏32位库.
  • 输出仍然是32位!这意味着我在尝试从x64应用程序链接到库时遇到"未解析的外部符号"错误.

c c++ windows 64-bit win64

16
推荐指数
1
解决办法
4万
查看次数

psql:FATAL:用户窗口8的密码验证失败

我在windows上安装了postgresql,而安装它要求为该帐户创建一个用户.这使我的计算机中的一个名为postgres的新Windows用户,我也为它创建了一个密码.

现在我想在Windows命令行上运行psql,它要求输入密码(不提及用户)并且总是给我回错:psql: FATAL: password authentication failed for user "Ash".即使我已经多次设置了我的帐户密码.

使用pgadmin我将用户"postgres"更改为"Ash",但我还没有重新设置密码.我按照这里的步骤操作:我忘记了在postgres安装期间输入的密码(我更喜欢打字,host all 127.0.0.1/32 trust因为我在Windows上),但是当再次运行psql以便我可以更改密码时我得到错误:psql FATAL:could not load pg_hba.conf.全部在一起.

为什么不加载?我所做的只是添加一个额外的身份验证选项.

Windows用户是否与postresql用户分开,或者它们是否相同(彼此依赖)?

编辑:

正如你所看到的,它没有让我选择Aisha是否应该成为超级用户.或其他选择.

我也用过pgadmin ||| 创建新用户但弹出相同的错误: 在此输入图像描述 在此输入图像描述

用户不存在,为什么这样做?

windows authentication postgresql win64

12
推荐指数
2
解决办法
5万
查看次数

写大文件

我尝试写一个大文件,但似乎它不适用于大于2GB的文件.我尝试过boost :: iostreams :: file_sink.这只是增强流的限制吗?还有其他方法我可以在Win64和win32上写一个大文件吗?

c++ file-io win64

11
推荐指数
2
解决办法
2819
查看次数