Сбой программы в x64, отлично работает в Win32 - PullRequest
3 голосов
/ 16 февраля 2010

Я работаю над приложением, которое прекрасно работает и работает в Win32. Тем не менее, в x64, он строит, но вылетает при запуске. Если посмотреть на код и сузить проблему, если я закомментирую вызов нижеприведенной функции, он запускается без проблем.

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

Я строю в Visual Studio 2008 с помощью компилятора C / C ++. Все обновления были установлены. Есть идеи?

РЕДАКТИРОВАТЬ 1 (чтобы ответить на комментарии):

Указатели должны быть действительными, как в 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 (чтобы ответить больше комментариев):

Изменена строка в,

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

Новая информация об ошибке имеет тот же код исключения и смещение ошибки.

Ответы [ 2 ]

4 голосов
/ 16 февраля 2010

Тот факт, что он все еще дает сбой с memcpy, подтверждает, что источник неверного указателя находится в другом месте, как и ожидалось.

Насколько велико приложение? Похоже, что где-то вдоль строки, указатель был усечен до 32 бит или иным образом поврежден. Скорее всего, вам нужно будет потратить некоторое время на отладчик, чтобы отследить точное местоположение.

2 голосов
/ 16 февраля 2010

Первое, что приходит на ум и может быть причиной этого сбоя, - это преобразование из указателя в int и обратно. На Win32 указатель и int имеют длину 32 бита, на Win64 указатель может быть длиной 64 бита, а int - только 32 бита.

...