关于在加载dll时可能导致Windows崩溃的原因寻求一些建议。
我正在用C ++编写Windows VST3 .dll插件,并且在加载我的.dll时在启动时发生崩溃。通过Visual Studio 2019调试器运行主机应用程序和插件时,我得到了上面显示的Access violation executing location ...
对话框,并且调用堆栈为空,使我认为内存已完全损坏。
也许这是由于构建.dll时需要调整的链接选项引起的?
以下是一些事实:
[不幸的是,将整个空白的VST3插件放在一起是太多代码,无法在StackOverflow问题中发布。但是,由于如果我注释掉对第三方库的所有调用,就可以使插件正常工作,因此我认为代码本身不是问题,我认为dll(.vst3)文件的构建方式是问题所在。] >
构建.vst3 dll文件的CMakeLists.txt
文件的关键部分看起来像这样:
FIND_LIBRARY ( SuperpoweredSDK NAMES SuperpoweredWin141_Debug_MD_x64.lib PATHS ${SUPERPOWERED_DIR}/libWindows )
SET ( TEST_EXTERNAL_DEPS PRIVATE Threads::Threads ${SuperpoweredSDK} )
FILE ( GLOB JUCE_SOURCE ${CMAKE_HOME_DIRECTORY}/JuceLibraryCode/*.cpp )
LIST ( FILTER JUCE_SOURCE EXCLUDE REGEX ".+/JuceLibraryCode/include_juce_audio_plugin_client_[^u].+" )
FILE ( GLOB PLUGIN_SOURCE *.cpp )
ADD_LIBRARY ( TestVST3 SHARED ${JUCE_SOURCE} ${PLUGIN_SOURCE} ${CMAKE_HOME_DIRECTORY}/JuceLibraryCode/include_juce_audio_plugin_client_VST3.cpp )
SET_TARGET_PROPERTIES ( TestVST3 PROPERTIES OUTPUT_NAME "Test" SUFFIX ".vst3" )
TARGET_LINK_LIBRARIES ( TestVST3 PUBLIC ${TEST_EXTERNAL_DEPS} )
寻找有关在加载dll时在Windows中导致此类崩溃的建议。我正在用C ++编写Windows VST3 .dll插件,并且当我的.dll是...]时,启动时发生崩溃。
class C { public: C() { __debugbreak(); } // Compiles into `int 3` interrupt, will definitely crash }; static C g_c;
当您链接外部库但不调用它时,链接器的无效代码清除功能通常会删除完整的.obj文件,这些文件已链接但未使用。这也将变量及其构造函数放在那里。
一种调试方法,在DllMain上设置断点。但实际上并没有导出您代码中的DllMain
,即另一个。在VC ++ 2017 CRT中,一个被称为dllmain_dispatch
,其源文件在VC ++运行时中,即crt\src\vcruntime\dll_dllmain.cpp
。该dllmain_dispatch会在调用您的DllMain
之前调用几个函数,其中一个dllmain_crt_process_attach
会调用_initterm
,而实际上是调用所有全局函数的构造函数。在您的情况下,其中至少有一个失败。
P.S。这样的崩溃的可能原因,您的第三方库正在尝试使用COM,并且名为LoadLibrary的线程从未调用CoInitialize()。