【问题标题】:Starting a program with the debugger attached causes program shutdown启动带有调试器的程序会导致程序关闭
【发布时间】:2014-12-18 11:49:51
【问题描述】:

当我通过带有调试器的 Visual Studio 2012 启动我的 C++ 程序时,该程序会在 dll 加载后立即关闭。调用堆栈显示正在调用 FreeLibrary。

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

该程序由一个启动器 (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

【问题讨论】:

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

标签: c++ debugging visual-studio-2012 dll


【解决方案1】:

我知道上述问题的原因,但是您要调试的代码中的 DebugBreak() 呢? 从堆栈跟踪看来,函数 MemoryDe​​bug_CheckMemory 正在显示 AlertMessage 然后启动退出。

【讨论】:

  • 这不是答案。
猜你喜欢
  • 1970-01-01
  • 2011-11-23
  • 2011-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
相关资源
最近更新 更多