2014-07-09 1 views
0

je mis à jour un projet de VS2012 à VS2013, la version fonctionne correctement, mais la version de débogage échoue sur une assertion. Je regarde lentement le RegisterCategory dépasser le nombre maximum de catégories. En passant par le débogueur, ils semblent tous comme des catégories raisonnablement intitulées, et ensuite la chose échoue à l'affirmer.Trop de catégories définies dans ATL Trace

Embrouillant, les fonctions atltrace.h telles que les suivantes semblent être appelé plus d'une fois. Avec des adresses de fonctions différentes, je suppose que ce ne serait pas un problème si ce n'est pas pour la limite de 32.

__declspec(selectany) CTraceCategoryEx<CTraceCategoryEx<>::TraceISAPI> atlTraceISAPI(_T("atlTraceISAPI")); 

Que se passe-t-il? Puis-je désactiver atltrace?

static void RegisterCategory(_In_z_ LPCTSTR pszCategory, unsigned int nCategory) 
    { 
     if (pszCategory == nullptr) 
     { 
      return; 
     } 

     if (m_nLastCategory >= MaxCategoryArray) 
     { 
      ATLASSERT(false && "Too many categories defined"); 
      return; 
     } 

     m_nMap[m_nLastCategory].nCategory = nCategory; 
#ifdef _UNICODE 
     wcscpy_s(m_nMap[m_nLastCategory].categryName, MaxLengthOfCategoryName - 1, pszCategory); 
#else 
     wchar_t buffer[MaxLengthOfCategoryName] = { 0 };  
     swprintf_s(buffer, MaxLengthOfCategoryName - 1, L"%S", pszCategory); 
     wcscpy_s(m_nMap[m_nLastCategory].categryName, MaxLengthOfCategoryName - 1, buffer); 
#endif 

     m_nLastCategory++; 
    } 

Linker 2012 (travail)

/OUT:"C:\Users\kandel\Desktop\obfuscated\x64\Debug\\mine.exe" /MANIFEST /NXCOMPAT /PDB:"C:\Users\kandel\Desktop\obfuscated\x64\Debug\mine.pdb" /DYNAMICBASE "C:\Users\kandel\Desktop\fslim\\glew\glew-1.9.0\lib\glew32.lib" "C:\Users\kandel\Desktop\fslim\\glew\glew-1.9.0\lib\glew32mx.lib" "C:\Users\kandel\Desktop\fslim\\Andor SDK3\atcorem.lib" "BNSPCIeBoard.lib" "cudart.lib" "cuda.lib" "WINMM.lib" "libgmp-10.lib" "libtiff.lib" "qtmaind.lib" "Qt5Cored.lib" "Qt5Guid.lib" "Qt5OpenGLd.lib" "Qt5PrintSupportd.lib" "opengl32.lib" "glu32.lib" "Qt5Widgetsd.lib" "opencv_core300d.lib" "opencv_cuda300d.lib" "opencv_cudaarithm300d.lib" "opencv_cudaimgproc300d.lib" /DEBUG /MACHINE:X64 /PGD:"C:\Users\kandel\Desktop\obfuscated\x64\Debug\mine.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"x64\Debug\SLIM4.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"C:\Qt\5.2.1\msvc2012_64_opengl\lib" /LIBPATH:"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.0\lib\x64" /TLBID:1 

VS 2013 ne fonctionne pas

/OUT:"C:\Users\QLI\Desktop\obfuscated\x64\Debug\\mine.exe" /MANIFEST:NO /NXCOMPAT /PDB:"C:\Users\QLI\Desktop\obfuscated\x64\Debug\mine.pdb" /DYNAMICBASE "C:\Users\QLI\Desktop\obfuscated\\Andor SDK3\atcorem.lib" "BNSPCIeBoard.lib" "cudart.lib" "cuda.lib" "WINMM.lib" "libgmp-10.lib" "libtiff.lib" "qtmaind.lib" "Qt5Cored.lib" "Qt5Guid.lib" "Qt5OpenGLd.lib" "Qt5PrintSupportd.lib" "opengl32.lib" "glu32.lib" "Qt5Widgetsd.lib" "opencv_core300d.lib" "opencv_cuda300d.lib" "opencv_cudaarithm300d.lib" "opencv_cudaimgproc300d.lib" /DEBUG /MACHINE:X64 /PGD:"C:\Users\QLI\Desktop\obfuscated\x64\Debug\mine.pgd" /SUBSYSTEM:CONSOLE /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /ManifestFile:"x64\Debug\mine.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"C:\Qt\Qt5.3.1\5.3\msvc2013_64_opengl\lib" /LIBPATH:"C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v6.5\lib\x64" /TLBID:1 

La principale différence entre ces deux est que dans VS2012 je pouvais choisir no atl et tout a bien fonctionné/correctement , où dans VS2013 je ne peux pas choisir cette option.

--edit--

J'ai supprimé toutes les bibliothèques externals sauf Qt et CUDA. Remarqué que la suppression #include <afxwin.h> de l'en-tête précompilé fait disparaître le problème, même si je dois utiliser afxwin.h ...

+0

Vous en quelque sorte brisé __declspec (selectany). Un problème connu avec le btw ICC d'Intel. Vos paramètres d'éditeur de liens sont certainement pertinents. –

+0

@HansPassant Merci pour la réponse, j'utilise VS pour relier. Je me demande comment 'selectany' choisit quelle bibliothèque pour charger lorsque vous avez à la fois le débogage et relâchez dll? – Mikhail

Répondre

0

j'ai pu contourner le problème en déplaçant la partie afx de mon code dans une dll et en supprimant l'en-tête . Pourquoi cette fonctionnalité a changé entre la version VS est une question persistante. Je ne peux que conclure que le MS a cassé mon code en changeant les nombres max qui peuvent être enregistrés.

Questions connexes