【问题标题】:Program crash in x64, works fine in Win32x64 中的程序崩溃,在 Win32 中运行良好
【发布时间】:2010-02-16 04:24:53
【问题描述】:

我正在开发一个在 Win32 中构建和运行良好的应用程序。但是,在 x64 中,它会构建但在运行时会崩溃。查看代码并缩小问题范围,如果我注释掉对以下函数的调用,它运行没有问题。

void vec3_copy (double* v1, const double* v2) {
    v1[0] = v2[0]; v1[1] = v2[1]; v1[2] = v2[2];
}

我正在使用 C/C++ 编译器在 Visual Studio 2008 中构建。所有更新均已安装。有什么想法吗?

编辑 1(回答 cmets):

指针应该是有效的,就像在 Win32 中一样,它运行良好。没有代码被改变并且没有采用不同的路径,除非指针因为它的 x64 被稍微修改(将调查这个)。

很遗憾,没有关于崩溃的信息。在 Windows 7 中,它只是说它正在寻找问题的解决方案,什么也没找到,然后在命令提示符中返回。在事件查看器中,我能够找到以下信息:

Faulting application name: DRR_C.exe, version: 0.0.0.0, time stamp: 0x4b7a1ee1
Faulting module name: DRR_C.exe, version: 0.0.0.0, time stamp: 0x4b7a1ee1
Exception code: 0xc0000005
Fault offset: 0x0000000000003950
Faulting process id: 0x16a4
Faulting application start time: 0x01caaec078a9c84a
Faulting application path: D:\Development\gpu\dev\DRR_C\x64\Debug\DRR_C.exe
Faulting module path: D:\Development\gpu\dev\DRR_C\x64\Debug\DRR_C.exe

编辑 2(回答更多 cmets):

修改为,

memcpy(v1, v2, 3 * sizeof(double));

新的错误信息具有相同的异常代码和故障偏移量。

【问题讨论】:

  • 什么样的崩溃?该代码看起来没问题,只要您确定 v1v2 是有效指针...
  • 那个代码没问题。您的问题出在导致v1v2 的调用链中的某个位置,它们在失败的调用中具有它们所具有的特定值(很可能在一些隐式假设32 位指针差异或类似的指针算术中)。除此之外,您真的应该使用 memcpy( ) 来处理这类事情。
  • 是否可以不使用 double 作为类型进行分配。即 malloc(sizeof(MACRO) * 3) 其中宏被正确定义为 32 位而不是 64 位。同样使用 memcpy
  • 异常代码 0xc0000005 用于访问冲突异常,这意味着您的程序正在尝试读取或写入它不拥有的内存。您能否在调试器下运行您的应用程序并确保 v1 和 v2 的值正常?
  • "指针应该是有效的,就像在 Win32 中一样,它运行良好。"不合逻辑的推论。如果您以某种方式调用未定义的行为(例如通过取消引用错误指针),那么所有的赌注都将被取消。它很容易在一种情况下运行良好,但在另一种情况下却不行。 (不过,我同意您可能会在某处截断地址。)

标签: c++ c visual-studio-2008 winapi 64-bit


【解决方案1】:

它仍然与memcpy 崩溃的事实证实了坏指针的来源在其他地方,正如预期的那样。

应用程序有多大?它看起来像沿着这条线的某个地方,一个指针被截断为 32 位或以其他方式损坏。您很可能需要花一些时间使用调试器来跟踪确切的位置。

【讨论】:

    【解决方案2】:

    首先想到并可能导致此崩溃的是从指针到 int 的转换,然后再返回。在 Win32 上,指针和 int 都是 32 位长,在 Win64 上,指针可能是 64 位长,而 int 可能只有 32 位长。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多