如何在执行期间停止C ++应用程序以调试到dll?

时间:2009-06-02 18:05:41

标签: c++ visual-studio debugging dll

我有一个我没有代码的应用程序,以及我有代码的dll。我需要能够调试到DLL,但缺少exe的源代码,我该怎么做?

dll代码是mfc c ++;我相信主应用程序也是一样的。

我已经尝试过做“设定目标应用程序”交易,在那里我设置了将从中调用dll的应用程序,并且应用程序在这样调用时崩溃了一个可怕的,可怕的死亡。我不知道这个dll或者该行为的可执行文件是否存在错误,这只是我想要解决的无数事情之一。

我认为应该有一些调用允许dll无限期地旋转,直到调试器附加到进程,此时我应该能够通过附加到进程来调试dll。那有意义吗?有更好的方法吗?

11 个答案:

答案 0 :(得分:4)

我曾经使用DebugBreak函数。您可以根据特定文件的存在来有条件地调用它。

#ifdef DEBUG
if (... file exists...) {
    DebugBreak();
}
#endif

这将暂停应用程序执行,直到您附加调试器或终止应用程序。

答案 1 :(得分:2)

有一个名为ImageFileExecutionOptions的注册表设置,可以设置为在加载DLL时启动调试器。我曾经用它来调试ISAPI扩展。这是一个链接to a decent blog entry about it

答案 2 :(得分:2)

如果应用程序链接到非调试DLL并且本身没有调试符号,那么这实际上不太可能富有成效。您可能希望查看here有关使用Windows符号包的信息,以帮助您,如果您对Windows DLL中的内容感到好奇,但总的来说,一个没有调试信息的应用程序,你可以“编译不能以任何有意义的方式调试。”

答案 3 :(得分:1)

使用DLL项目,您应该能够告诉Visual Studio开始调试,它会询问您是否有可执行文件名。在那里输入你的exe。当我处理从另一个进程调用的DLL代码时,我已经做了很多。适用于直接DLL和COM组件。

如果你知道问题可能在哪里,也可以提前在代码中设置一些断点。

更新:由于这对你不起作用,我能想到的唯一另一件事就是附加到正在运行的exe上,但如果你的代码在你拥有之前加载了,这可能会有问题有机会进入那里。

答案 4 :(得分:1)

__asm int {3};
你的DLL主目录中的

。然后将调试器附加到进程? 如果这会杀死进程,那么它可能拥有它自己的int3陷阱并且正在退出。您是否正在尝试调试受版权保护的游戏或类似的东西?因为他们倾向于做那种棘手的行为。

答案 5 :(得分:1)

等到调试器出现:

while(!IsDebuggerPresent())
{
  Sleep(0);  // yield
}

MSDN文档:IsDebuggerPresent()

答案 6 :(得分:1)

确保应用程序确实使用您在调试模式下使用符号构建的DLL。您可以使用Process Explorer等程序对此进行验证(在此应用程序中,启用“视图”菜单中的下方窗格并选择DLL)。

然后,在Visual Studio的“调试”菜单中,选择“附加到进程”,然后选择使用DLL的应用程序。如果加载DLL,则应填写调试断点。

答案 7 :(得分:1)

我最近不得不使用此处列出的方法之一: http://blogs.msdn.com/greggm/archive/2004/07/08/177418.aspx

这有帮助吗?

答案 8 :(得分:0)

这是一个简单的解决方案:在DllMain(或其他一些启动代码)中添加Sleep(10000);,然后在代码处于休眠状态时使用Tools / Attach to Process附加调试器。

答案 9 :(得分:0)

  

我在想应该有一些   打电话让dll旋转   无限期地直到调试器   附在过程中,在此过程中   我应该能够调试   dll通过附加到进程。是否   有道理?有没有更好的办法   这样做?

为什么不按照你的描述方式去做呢?只需启动要调试的应用程序即可。通过Visual Studio或只需右键单击任务管理器中的应用程序并选择Debug,将调试器附加到它。连接调试器后,在dll代码中的适当位置设置F9的断点。

答案 10 :(得分:0)

  

我试过做'设定目标   应用程序'交易,我设置的地方   这个dll的应用程序   从中调用,以及应用程序   坠毁了一场可怕的,可怕的死亡   当这样称呼时。我不知道   错误在于这个dll或者   该行为的可执行文件,以及   这只是我所做的无数事情之一   喜欢解决。

在调试器内启动进程会导致Windows启用NT debug heap。听起来应用程序或DLL有堆损坏或依赖于未初始化的堆内存的值。

您可以通过将环境变量_NO_DEBUG_HEAP设置为1(在XP及更高版本上)来禁用NT调试堆。这可能使应用程序在从调试器启动时不会死于可怕的死亡。

在调试器外部启动应用程序也会导致禁用NT调试堆,稍后附加调试器将无法启用它。