我有一个我没有代码的应用程序,以及我有代码的dll。我需要能够调试到DLL,但缺少exe的源代码,我该怎么做?
dll代码是mfc c ++;我相信主应用程序也是一样的。
我已经尝试过做“设定目标应用程序”交易,在那里我设置了将从中调用dll的应用程序,并且应用程序在这样调用时崩溃了一个可怕的,可怕的死亡。我不知道这个dll或者该行为的可执行文件是否存在错误,这只是我想要解决的无数事情之一。
我认为应该有一些调用允许dll无限期地旋转,直到调试器附加到进程,此时我应该能够通过附加到进程来调试dll。那有意义吗?有更好的方法吗?
答案 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)
答案 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调试堆,稍后附加调试器将无法启用它。