在我的主应用程序中加载一个 dll 怎么会导致 100 CPU 加载?
How could just loading a dll lead to 100 CPU load in my main application?
我有一个完美的工作程序,它连接到摄像机(IDS uEye 摄像机)并不断从中抓取帧并显示它们。
但是,当在 连接到相机之前加载特定的 dll 时,程序以 100% CPU 负载运行。如果我在 连接到相机后加载 dll ,程序运行正常。
int main()
{
INT nRet = IS_NO_SUCCESS;
// init camera (open next available camera)
m_hCam = (HIDS)0;
// (A) Uncomment this for 100% CPU load:
// HMODULE handle = LoadLibrary(L"myInnocentDll.dll");
// This is the call to the 3rdparty camera vendor's library:
nRet = is_InitCamera(&m_hCam, 0);
// (B) Uncomment this instead of (A) and the CPU load won't change
// HMODULE handle = LoadLibrary(L"myInnocentDll.dll");
if (nRet == IS_SUCCESS)
{
/*
* Please note: I have removed all lines which are not necessary for the exploit.
* Therefore this is NOT a full example of how to properly initialize an IDS camera!
*/
is_GetSensorInfo(m_hCam, &m_sInfo);
GetMaxImageSize(m_hCam, &m_s32ImageWidth, &m_s32ImageHeight);
m_nColorMode = IS_CM_BGR8_PACKED;// IS_CM_BGRA8_PACKED;
m_nBitsPerPixel = 24; // 32;
nRet |= is_SetColorMode(m_hCam, m_nColorMode);
// allocate image memory.
if (is_AllocImageMem(m_hCam, m_s32ImageWidth, m_s32ImageHeight, m_nBitsPerPixel, &m_pcImageMemory, &m_lMemoryId) != IS_SUCCESS)
{
return 1;
}
else
{
is_SetImageMem(m_hCam, m_pcImageMemory, m_lMemoryId);
}
}
else
{
return 1;
}
std::thread([&]() {
while (true) {
is_FreezeVideo(m_hCam, IS_WAIT);
/*
* Usually, the image memory would now be grabbed via is_GetImageMem().
* but as it is not needed for the exploit, I removed it as well
*/
}
}).detach();
cv::waitKey(0);
}
独立于实际使用的相机驱动程序,加载 dll 会以何种方式改变它的性能,占用所有可用 CPU 内核的 100%?使用 Visual Studio 诊断工具时,额外的 CPU 时间归因于“[外部调用] SwitchToThread”而不是 myInnocentDll。
仅加载 dll 而未初始化相机不会导致 100% CPU 加载。
我首先想到 myInnocentDll.dll 配置一些线程行为中的一些静态初始值设定项,但我没有找到指向这个方向的任何东西。在myInnocentDll.dll?
的代码中我应该寻找哪些方面
经过大量挖掘,我找到了答案,它本身既简单又令人沮丧:
微软对OpenMP支持不力。当我在项目中禁用 OpenMP 时,相机驱动程序运行正常。
原因似乎是 Microsoft 编译器使用 OpenMP 忙等待,也有可能手动配置 OMP_WAIT_POLICY
,但由于我无论如何都不依赖 OpenMP,禁用是最简单的解决方案我.
-
-
我仍然不明白为什么 CPU 只在使用相机时变高而不是 运行 我的其余解决方案时,即使相机库是 pre-built 而我的disabling/enabling 的OpenMP 编译不能对它产生任何影响。而且我也不明白为什么他们费心为 VS2010 制作修补程序,但截至我正在使用的 VS2019 没有真正的修复。但是问题就避免了。
您可以在 IDS 相机管理器中禁用 CPU 空闲状态,然后将 windows 能源计划中的最小 CPU 负载设置为 100%
我觉得这里值得一提,即使你已经解决了你的问题。
我有一个完美的工作程序,它连接到摄像机(IDS uEye 摄像机)并不断从中抓取帧并显示它们。
但是,当在 连接到相机之前加载特定的 dll 时,程序以 100% CPU 负载运行。如果我在 连接到相机后加载 dll ,程序运行正常。
int main()
{
INT nRet = IS_NO_SUCCESS;
// init camera (open next available camera)
m_hCam = (HIDS)0;
// (A) Uncomment this for 100% CPU load:
// HMODULE handle = LoadLibrary(L"myInnocentDll.dll");
// This is the call to the 3rdparty camera vendor's library:
nRet = is_InitCamera(&m_hCam, 0);
// (B) Uncomment this instead of (A) and the CPU load won't change
// HMODULE handle = LoadLibrary(L"myInnocentDll.dll");
if (nRet == IS_SUCCESS)
{
/*
* Please note: I have removed all lines which are not necessary for the exploit.
* Therefore this is NOT a full example of how to properly initialize an IDS camera!
*/
is_GetSensorInfo(m_hCam, &m_sInfo);
GetMaxImageSize(m_hCam, &m_s32ImageWidth, &m_s32ImageHeight);
m_nColorMode = IS_CM_BGR8_PACKED;// IS_CM_BGRA8_PACKED;
m_nBitsPerPixel = 24; // 32;
nRet |= is_SetColorMode(m_hCam, m_nColorMode);
// allocate image memory.
if (is_AllocImageMem(m_hCam, m_s32ImageWidth, m_s32ImageHeight, m_nBitsPerPixel, &m_pcImageMemory, &m_lMemoryId) != IS_SUCCESS)
{
return 1;
}
else
{
is_SetImageMem(m_hCam, m_pcImageMemory, m_lMemoryId);
}
}
else
{
return 1;
}
std::thread([&]() {
while (true) {
is_FreezeVideo(m_hCam, IS_WAIT);
/*
* Usually, the image memory would now be grabbed via is_GetImageMem().
* but as it is not needed for the exploit, I removed it as well
*/
}
}).detach();
cv::waitKey(0);
}
独立于实际使用的相机驱动程序,加载 dll 会以何种方式改变它的性能,占用所有可用 CPU 内核的 100%?使用 Visual Studio 诊断工具时,额外的 CPU 时间归因于“[外部调用] SwitchToThread”而不是 myInnocentDll。
仅加载 dll 而未初始化相机不会导致 100% CPU 加载。
我首先想到 myInnocentDll.dll 配置一些线程行为中的一些静态初始值设定项,但我没有找到指向这个方向的任何东西。在myInnocentDll.dll?
的代码中我应该寻找哪些方面经过大量挖掘,我找到了答案,它本身既简单又令人沮丧:
微软对OpenMP支持不力。当我在项目中禁用 OpenMP 时,相机驱动程序运行正常。
原因似乎是 Microsoft 编译器使用 OpenMP 忙等待,也有可能手动配置 OMP_WAIT_POLICY
,但由于我无论如何都不依赖 OpenMP,禁用是最简单的解决方案我.
我仍然不明白为什么 CPU 只在使用相机时变高而不是 运行 我的其余解决方案时,即使相机库是 pre-built 而我的disabling/enabling 的OpenMP 编译不能对它产生任何影响。而且我也不明白为什么他们费心为 VS2010 制作修补程序,但截至我正在使用的 VS2019 没有真正的修复。但是问题就避免了。
您可以在 IDS 相机管理器中禁用 CPU 空闲状态,然后将 windows 能源计划中的最小 CPU 负载设置为 100%
我觉得这里值得一提,即使你已经解决了你的问题。