问题标签 [64-bit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
6240 浏览

c++ - 你如何让 StackWalk64() 在 x64 上成功运行?

我有一个 C++ 工具,它可以一次遍历调用堆栈。在代码中,它首先获取实时 CPU 寄存器的副本(通过 RtlCaptureContext()),然后使用一些 " #ifdef ..." 块将 CPU 特定的寄存器名称保存到stackframe.AddrPC.Offset、 ... AddrStack... 和 ... 中AddrFrame。 ..; 此外,对于上述 3 个Addr... 成员中的每一个,它都设置了stackframe.Addr... .Mode = AddrModeFlat。(这是从我不久前遇到的一些示例代码中借来的。)

使用 x86 二进制文件,这很好用。但是,对于 x64 二进制文件,StackWalk64() 会传回虚假地址。 (第一次调用 API 时,唯一公然伪造的地址值出现在AddrReturn(== 0xFFFFFFFF'FFFFFFFE-- aka StackWalk64() 的第三个参数,GetCurrentThread() 返回的伪句柄)中。如果第二次调用 API ,但是,所有Addr... 变量都会收到虚假地址。) 无论如何AddrFrame设置都会发生这种情况:

  • 使用任一推荐的 x64“基/帧指针”CPU 寄存器:rbp(= 0xf) 或rdi(= 0x0)
  • 使用rsp (没想到它会起作用,但还是尝试了)
  • 设置AddrPCAddrStack正常,但保持AddrFrame归零(在其他示例代码中看到)
  • 清零所有Addr... 值,让 StackWalk64() 从传入的 CPU 寄存器上下文中填充它们(在其他示例代码中看到)

FWIW,物理堆栈缓冲区的内容在 x64 和 x86 上也不同(当然,在考虑了不同的指针宽度和堆栈缓冲区位置之后)。不管是什么原因, StackWalk64() 应该仍然能够正确地遍历调用堆栈——哎呀,调试器仍然能够遍历调用堆栈,而且它似乎在幕后使用 StackWalk64() 本身。奇怪的是,调试器报告的(正确的)调用堆栈包含基地址和返回地址指针值,其组成字节实际上并不存在于堆栈缓冲区中(低于或高于当前堆栈指针)。

(FWIW #2:鉴于上面的堆栈缓冲区奇怪,我确实尝试禁用 ASLR ( /dynamicbase:no) 以查看它是否有所作为,但二进制文件仍然表现出相同的行为。)

所以。任何想法为什么这在 x86 上可以正常工作,但在 x64 上会出现问题?关于如何修复它的任何建议?

0 投票
2 回答
9981 浏览

winapi - SHGetFolderPath() 32 位与 64 位

如果我在具有 CSIDL_PROGRAM_FILESx86 文件夹 id 而不是 CSIDL_PROGRAM_FILES id 的 32 位系统中使用SHGetFolderPath api 调用会发生什么?

理论上 CSIDL_PROGRAM_FILESx86 应该映射到C:\program files (x86)64 位系统,但它在不存在此路径的 32 位系统中映射到什么?

0 投票
5 回答
3857 浏览

java - 缓冲一个大文件;BufferedInputStream 限制为 2gb;数组限制为 2^31 字节

我正在按顺序处理一个大文件,我想将其中的一大块保存在内存中,在 64 位系统上可用 16gb 内存。

一种快速而肮脏的方法是这样做,只需将输入流包装到缓冲输入流中,不幸的是,这只给了我一个 2gb 的缓冲区。我想有更多的记忆,我有什么选择?

0 投票
7 回答
1057 浏览

.net - 在 x64 和 x86 上运行 .net 程序是否需要考虑任何因素?

我相信架构类型(x86 与 x64)在制作 .Net 程序时已为您抽象出来,但还有其他可能导致问题的考虑因素吗?

0 投票
8 回答
105408 浏览

.net - 在同一解决方案/项目中使用 Visual Studio 以 32 位和 64 位为目标

我对如何设置我的视觉工作室构建以实现多目标有点进退两难。

背景:c# .NET v2.0 带有 p/invoking 到第 3 方 32 位 DLL,SQL compact v3.5 SP1,带有安装项目。现在,平台目标设置为 x86,因此可以在 Windows x64 上运行。

第 3 方公司刚刚发布了他们的 DLL 的 64 位版本,我想构建一个专用的 64 位程序。

这提出了一些我还没有得到答案的问题。我想拥有完全相同的代码库。我必须使用对 32 位 DLL 集或 64 位 DLL 的引用来构建。(第 3 方和 SQL Server Compact)

这可以通过 2 组新配置(Debug64 和 Release64)来解决吗?

我必须创建 2 个单独的设置项目(std.visual studio 项目,没有 Wix 或任何其他实用程序),还是可以在同一个 .msi 中解决?

欢迎任何想法和/或建议。

0 投票
3 回答
2423 浏览

c++ - 如何从一个 long long int 中提取四个 unsigned short int?

假设我有一个 long long int 并且想要取出它的位并从中构造四个 unsigned short int。

特定的顺序在这里并不重要。

我通常知道我需要移位并截断到 unsigned short int 的大小。但我想我可能会在某个地方犯一些奇怪的错误,所以我问。

0 投票
11 回答
188783 浏览

c++ - 将指针转换为整数

我正在尝试使现有代码适应 64 位机器。主要问题是在一个函数中,前面的编码器使用了一个 void* 参数,该参数在函数本身中被转换为合适的类型。一个简短的例子:

当然,在 64 位机器上,我得到了错误:

我想更正此问题,以便它仍然可以在 32 位机器上运行,并且尽可能干净。任何的想法 ?

0 投票
8 回答
5688 浏览

64-bit - 开发 PC:AMD 与 Intel 以及 32 位与 64 位

我正在寻找购买新的开发 PC。我的预算不超过 1,000 美元(包括显示器)。我对笔记本电脑(台式机更换类型)持开放态度,或者传统的台式电脑就可以了。

我的主要开发环境是 Microsoft、Visual Studio 2008(以及对旧版 Visual Studio 6 代码的支持)。SQL Server 2005、2008 以及对 SQL Server 2000 的旧版支持。Microsoft Office 2003,可能安装 2007,但支持早至 Office 2000。我将编写和支持的软件主要是 Windows XP,但也有一些 Vista。我将不得不假设有 64 位实现可供安装。

我的第一个困惑始于选择 AMD 或 Intel。我担心的是在 AMD 环境中使用 Visual Studio 构建软件存在兼容性问题。我没有任何证据,只是担心有人会为我澄清。

最后,我对 32 位和 64 位安装感到困惑。即使 64 位正在稳步发展,我是否应该坚持使用最小公分母(32 位)?我知道 64 位操作系统将处理超过 4G 的 RAM,我喜欢这样做,因为我想为测试环境设置尽可能多的虚拟机,并且可能同时有很多活动..

我不是在寻找梦想中的机器,只是一台带有显示器和最好的处理器的机器,大约 1000 美元,这将使我能够为那里的大多数机器编写软件。

0 投票
8 回答
41221 浏览

c++ - 你如何为 x64 编译 OpenSSL?

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

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

c++ - 你如何为 x64 编译静态 pthread-win32 库?

看起来已经做了一些工作来使pthread-win32与 x64 一起工作,但没有构建说明。我尝试使用 Visual Studio x64 交叉工具命令提示符进行简单构建,但是当我尝试从 x64 应用程序链接到 lib 时,它看不到任何函数导出。似乎它仍在将 lib 编译为 x86 或其他东西。

我什至尝试在适当的地方将 /MACHINE 添加到 makefile 中,但这没有帮助。有没有人让这个工作?