2009-06-02 40 views
3

我有一个应用程序,我没有代码,以及我有代码的dll。我需要能够调试到DLL,但缺乏EXE的来源,我该怎么做?如何在执行期间停止C++应用程序以调试到dll?

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

我试着做一个'设置目标应用程序'的协议,在那里我设置的应用程序,该DLL将被调用,并且应用程序崩溃一个可怕的,可怕的死亡,当这样调用。我不知道错误在于这个dll还是这个行为的可执行文件,这只是我想解决的无数事情之一。

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

+0

如果先启动exe然后附加调试器,会发生什么?您还无法设置断点? – Naveen 2009-06-02 18:13:00

+0

我怀疑你需要以你描述的标准方式调试exe/dll时才能到达崩溃的底部。虽然你可以在应用程序启动后“附加”一个调试器,但是我不知道系统是否会随即崩溃。 – Aardvark 2009-06-02 18:22:59

+0

@Naveen:如果我附加到正在运行的进程,则忽略断点。 @Aardvark:在我将要尝试的那个调试中断事件后我会发现。我强烈怀疑,由于应用程序和dll通过希望和胶带粘在一起,我不打算修复崩溃。我只想提取一部分dll,以便能够以一种理智的方式进行重写。 – mmr 2009-06-02 18:35:15

回答

2

如果应用程序与非调试DLL链接,并且本身没有调试符号,这可能并不是很有成效。你可能想看看here以获得关于使用windows符号包来帮助你的信息,如果你对windows DLL里面发生了什么感到好奇,但总的来说,没有调试信息并且你不能编译的应用程序isn可以用任何有意义的方式调试。

2

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

+0

所以,我试图做到这一点,并没有完全奏效。我将调试器设置为可执行文件,然后在我的dll项目中启动可执行文件。然后我设置了一个断点,但同样没有达到断点。如果将dll设置为该键的目标,那么调试器就不会启动。我可以给你更多的细节,因为这看起来像一个有前途的解决方案,但它现在不工作。 – mmr 2009-06-02 18:28:26

+0

我认为你必须设置一个断点然后恢复执行。基本上,调试器是使用NTLDR挂钩启动的,因此它在任何*代码执行之前启动。对于ISAPI扩展,我会在我的HttpExtensionProc中添加一个断点并让它运行。然后,只要通过扩展调用IIS,它就会停止。我似乎无法找到解释如何通过Google执行此操作的网页。查看调试ISAPI扩展的提示。祝你好运! – 2009-06-02 19:43:03

1

对于DLL项目,您应该能够告诉Visual Studio开始调试,并且它会询问您一个可执行文件的名称。在那里输入你的exe。当我研究从另一个进程调用的DLL代码时,我做了很多工作。适用于直连DLL以及COM组件。

如果您知道问题出在哪里,也可能有助于在代码中提前设置一些断点。

更新:由于这不适合你,我唯一能想到的其他事情就是附加到正在运行的exe文件,但是如果你的代码在你有机会获得之前被加载,那么这可能是有问题的在那里。

4

我以前使用DebugBreak这个功能。也许你可以根据特定文件的存在有条件地调用它。

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

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

0

这里有一个简单的解决方案:添加DllMain中Sleep(10000);(或一些其他的启动代码),然后使用Tools/Attach to Process附加调试器在代码正在睡觉。

1
__asm int {3}; 

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

0

我想应该有一些 调用允许DLL旋转 无限期,直到调试器附加到进程 ,在这 点我应该能够通过安装调试 DLL到这个过程。 有道理吗?有没有更好的方法 要做到这一点?

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

1

等待直到调试器是本:

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

MSDN文档:IsDebuggerPresent()

1

确保应用程序确实使用您在调试模式下使用符号构建的DLL。您可以使用诸如Process Explorer之类的程序(在此应用程序中启用“查看”菜单中的下窗格并选择DLL)来验证此情况。

然后,在Visual Studio的“调试”菜单中,选择“附加到进程”,然后选择使用您的DLL的应用程序。当你的DLL被加载时,你的调试断点应该被填充。

0

我试图做一个“设定的目标 应用”交易,在这里我设置 应用程序,该DLL将 从调用,应用 崩溃可怕的,可怕的死亡 叫做这样当。我不知道是否 错误在于此dll或 该行为的可执行文件,以及 这只是 想要解决的无数事情之一。

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

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

在调试器外部启动应用程序也会导致禁用NT调试堆,稍后连接调试器将不会启用它。

相关问题