2010-02-16 5 views
1

Je travaille sur une application qui se construit et tourne bien dans Win32. Cependant, en x64, il se construit mais se bloque en cours d'exécution. En regardant le code et en réduisant le problème, si je commente l'appel à la fonction ci-dessous, il fonctionne sans problème. Je construis dans Visual Studio 2008 avec le compilateur C/C++. Toutes les mises à jour ont été installées. Des idées?Crash du programme dans x64, fonctionne très bien dans Win32

EDIT 1 (pour répondre à des commentaires):

Les pointeurs doivent être valides, comme dans Win32, il fonctionne très bien. Aucun code n'est changé et un chemin différent n'est pas pris, à moins que le pointeur ne soit quelque peu modifié parce que son x64 (se penchera sur ceci).

Malheureusement, il n'y a aucune information sur le crash. Dans Windows 7, il dit simplement qu'il cherche une solution au problème, ne trouve rien, et retourne dans l'invite de commande. Dans l'Observateur d'événements, j'ai pu trouver les informations suivantes:

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 

EDIT 2 (pour répondre à d'autres commentaires):

a modifié la ligne,

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

information nouvelle erreur a le même code d'exception et le même défaut.

+2

Quel genre d'accident? Ce code semble correct, tant que vous êtes sûr que 'v1' &' v2' sont des pointeurs valides ... –

+2

Une erreur Message? –

+1

Ce code est correct. Votre problème est quelque part dans la chaîne d'appels qui conduit à 'v1' et' v2' ayant les valeurs particulières qu'ils ont dans l'appel qui échoue (probablement dans une arithmétique de pointeur qui suppose implicitement des différences de pointeur de 32 bits ou quelque chose de similaire). Cela mis à part, vous devriez vraiment utiliser 'memcpy()' pour ce genre de chose. –

Répondre

3

Le fait qu'il se bloque toujours avec memcpy confirme que la source du pointeur incorrect est ailleurs, comme prévu.

Quelle est la taille de l'application? Il semble que quelque part le long de la ligne, un pointeur a été tronqué à 32 bits ou autrement corrompu. Très probablement, vous devrez passer du temps de qualité avec le débogueur pour trouver l'emplacement exact.

1

La première chose qui vient à l'esprit et pourrait avoir causé ce plantage est une conversion de pointeur en int puis en arrière. Sur Win32, le pointeur et l'int ont tous deux une longueur de 32 bits, sur le point Win64, la longueur est de 64 bits et int est probablement de seulement 32 bits.

Questions connexes