启动附加了调试器的程序会导致程序关闭 当我通过VisualStudio 2012启动我的C++程序时,调试器附加在一起,程序在DLL加载时关闭。调用堆栈显示正在调用FreeLibrary

启动附加了调试器的程序会导致程序关闭 当我通过VisualStudio 2012启动我的C++程序时,调试器附加在一起,程序在DLL加载时关闭。调用堆栈显示正在调用FreeLibrary,c++,debugging,visual-studio-2012,dll,C++,Debugging,Visual Studio 2012,Dll,我在管理员模式下运行VS,在dll完全加载后附加调试器可以正常工作。加载期间附加调试器会导致相同的问题。 从VS启动程序而不附加调试器也可以正常工作 该程序由一个launcher Game.exe组成,该程序加载一个dll hw.dll,该dll依次加载我试图调试的dll client.dll。一旦加载dll,程序就会关闭,并且由于程序调用dll加载后初始化的函数指针,因此也会导致空指针调用 以下是堆栈跟踪: 00000000() Unknown [Frames below may be in

我在管理员模式下运行VS,在dll完全加载后附加调试器可以正常工作。加载期间附加调试器会导致相同的问题。 从VS启动程序而不附加调试器也可以正常工作

该程序由一个launcher Game.exe组成,该程序加载一个dll hw.dll,该dll依次加载我试图调试的dll client.dll。一旦加载dll,程序就会关闭,并且由于程序调用dll加载后初始化的函数指针,因此也会导致空指针调用

以下是堆栈跟踪:

00000000()  Unknown
[Frames below may be incorrect and/or missing]  
client.dll!AlertMessage(ALERT_TYPE atype, char * szFmt, ...) Line 129   C++
client.dll!MemoryDebug_CheckMemory(const char * pszMoment) Line 122 C++
client.dll!COnShutdownMemoryChecker::~COnShutdownMemoryChecker() Line 424   C++
client.dll!`dynamic atexit destructor for 'g_OnShutdownMemoryChecker''()    C++
client.dll!doexit(int code, int quick, int retcaller) Line 567  C
client.dll!_cexit() Line 408    C
client.dll!_CRT_INIT(void * hDllHandle, unsigned long dwReason, void * lpreserved) Line 174 C
client.dll!__DllMainCRTStartup(void * hDllHandle, unsigned long dwReason, void * lpreserved) Line 352   C
client.dll!_DllMainCRTStartup(void * hDllHandle, unsigned long dwReason, void * lpreserved) Line 293    C
ntdll.dll!_LdrxCallInitRoutine@16()    Unknown
ntdll.dll!LdrpCallInitRoutine() Unknown
ntdll.dll!LdrpProcessDetachNode()   Unknown
ntdll.dll!LdrpUnloadNode()  Unknown
ntdll.dll!LdrpDecrementNodeLoadCount()  Unknown
ntdll.dll!LdrUnloadDll()    Unknown
KernelBase.dll!_FreeLibrary@4()    Unknown
AcGenral.dll!NS_IgnoreFreeLibrary::APIHook_FreeLibrary(struct HINSTANCE__ *)    Unknown
GameOverlayRenderer.dll!0f57d78d()  Unknown
hw.dll!04a119f6()   Unknown

我知道上述问题的原因,但要调试的代码中的DebugBreak呢?
从stacktrace中,似乎函数MemoryDebug_CheckMemory正在显示AlertMessage,然后启动退出。

尝试使用运行您是否尝试从Visual Studio调试会话中启动客户端dll?它试图告诉您堆已损坏。非常糟糕,显示消息的代码也无法完成,并在尝试时死亡。仅通过附加调试器,堆怎么会损坏?在注释掉加载此dll的dll接收到的所有使用函数指针的代码后,我能够启动调试会话。在那之后,我实现了一个DllMain函数,我注意到客户端dll在加载使用之前加载和卸载了一次。我不知道为什么会这样,但现在我知道为什么会这样,我可以进一步调查。这不是答案。