ATL Trace 中定义的类别过多
Posted
技术标签:
【中文标题】ATL Trace 中定义的类别过多【英文标题】:Too many categories defined in ATL Trace 【发布时间】:2014-08-29 21:47:29 【问题描述】:我将一个项目从 VS2012 升级到 VS2013,发布版本正常工作,但调试版本在断言上失败。
在main
之前,我慢慢看着RegisterCategory
超过了最大类别数。逐步通过调试器,它们似乎都是合理命名的类别,然后事情就无法通过断言。
令人困惑的是,atltrace.h
中的函数(如下所示)似乎被多次调用。对于不同的函数地址,我想如果不是 32 限制,这不会是一个问题。
__declspec(selectany) CTraceCategoryEx<CTraceCategoryEx<>::TraceISAPI> atlTraceISAPI(_T("atlTraceISAPI"));
怎么了?我可以禁用 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++;
链接器 2012(工作)
/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 不工作
/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
这两者之间的主要区别在于,在 VS2012 中我可以选择 no atl
并且一切运行良好/正确,而在 VS2013 中我不能选择此选项。
--编辑--
我删除了除 Qt 和 CUDA 之外的所有外部库。注意到从预编译头文件中删除 #include <afxwin.h>
会使问题消失,尽管我需要使用 afxwin.h
...
【问题讨论】:
你以某种方式破坏了 __declspec(selectany)。顺便说一句,英特尔的 ICC 存在一个已知问题。您的链接器设置肯定是相关的。 @HansPassant 感谢您的回复,我正在使用 VS 进行链接。我想知道selectany
在您同时拥有调试和发布 dll 时如何选择要加载的库?
【参考方案1】:
我可以通过将我的代码的afx
部分移动到一个 dll 中并删除标题来解决这个问题。为什么这个功能在 VS 版本之间发生变化是一个挥之不去的问题。我只能通过更改可以注册的最大数量来断定 MS 破坏了我的代码。
【讨论】:
以上是关于ATL Trace 中定义的类别过多的主要内容,如果未能解决你的问题,请参考以下文章
使用 ATL 的 IDL 导出在 winbase.h 中定义的结构