C++ 如何阻止C++;应用程序在执行期间调试到dll中?
我有一个没有代码的应用程序和一个有代码的dll。我需要能够调试到dll中,但缺少exe的源代码,我如何做到这一点 < dll代码为MFC C++;我相信主应用程序也是一样的 我尝试过做一个“设置目标应用程序”的交易,在这里我设置了调用dll的应用程序,当这样调用时,应用程序崩溃了。我不知道是这个dll还是这个行为的可执行文件有问题,这只是我想解决的众多问题之一C++ 如何阻止C++;应用程序在执行期间调试到dll中?,c++,visual-studio,debugging,dll,C++,Visual Studio,Debugging,Dll,我有一个没有代码的应用程序和一个有代码的dll。我需要能够调试到dll中,但缺少exe的源代码,我如何做到这一点 < dll代码为MFC C++;我相信主应用程序也是一样的 我尝试过做一个“设置目标应用程序”的交易,在这里我设置了调用dll的应用程序,当这样调用时,应用程序崩溃了。我不知道是这个dll还是这个行为的可执行文件有问题,这只是我想解决的众多问题之一 我认为应该有一些调用来允许dll无限期地旋转,直到调试器连接到进程,在这一点上,我应该能够通过连接到进程来调试dll。这有意义吗?有更好
我认为应该有一些调用来允许dll无限期地旋转,直到调试器连接到进程,在这一点上,我应该能够通过连接到进程来调试dll。这有意义吗?有更好的方法吗?有一个名为
ImageFileExecutionOptions
的注册表设置,可以设置为在加载DLL时启动调试器。我曾经用它来调试ISAPI扩展。这是一个链接。如果应用程序是针对非调试DLL链接的,并且本身没有调试符号,那么这就不太可能产生效果。如果您对windows DLL中的内容感到好奇,您可能需要查找有关使用windows符号包的信息来帮助您,但总的来说,没有调试信息且无法编译的应用程序无法进行任何有意义的调试。对于DLL项目,您应该能够告诉VisualStudio开始调试,它会要求您输入一个可执行文件名。在那里输入您的exe。当我处理从另一个进程调用的DLL代码时,我已经做了很多。适用于直接DLL以及COM组件
如果您知道问题可能在哪里,那么提前在代码中设置一些断点也可能会有所帮助
更新:由于这对您不起作用,我唯一能想到的另一件事是附加到正在运行的exe,但如果您的代码在您有机会进入之前加载,则可能会出现问题。我曾经为此使用该函数。您可以根据特定文件的存在条件调用它
#ifdef DEBUG
if (... file exists...) {
DebugBreak();
}
#endif
这将停止应用程序的执行,直到您连接调试器或终止应用程序。这里有一个简单的解决方案:添加
睡眠(10000)在DllMain(或其他一些启动代码)中,然后使用Tools/Attach to Process
在代码休眠时附加调试器
__asm int {3};
在你的动态链接库中。然后将调试器附加到进程?
如果这扼杀了进程,那么它可能有自己的int3陷阱,正在退出。你是想调试一个受拷贝保护的游戏还是类似的东西?因为他们倾向于做那种欺骗的行为
我想应该有一些
调用以允许dll旋转
直到调试器被激活为止
附加到流程,在其中
我应该能够调试
通过附加到进程。做
这有道理吗?有更好的办法吗
这样做
为什么不按照你描述的方式去做呢?只需启动要调试的应用程序。通过VisualStudio或在任务管理器中右键单击应用程序并选择“调试”,将调试器附加到它。连接调试器后,在dll代码的适当位置用F9设置断点。等待调试器出现:
while(!IsDebuggerPresent())
{
Sleep(0); // yield
}
MSDN文档:。确保应用程序确实使用您在调试模式下构建的带有符号的DLL。您可以使用以下程序进行验证(在此应用程序中,启用“视图”菜单中的“下窗格”并选择“DLL”)
然后,在VisualStudio的“调试”菜单中,选择“附加到进程”,并选择使用DLL的应用程序。如果加载DLL,则调试断点应填充
我试着做一个“设定目标”
应用程序交易,我在这里设置
该dll将被删除的应用程序
从调用,以及应用程序
一场可怕的死亡
当你这么叫的时候。我不知道
错误在于此dll或
该行为的可执行文件,以及
这只是我想做的无数事情之一
我喜欢解决这个问题
在调试器内启动进程会导致Windows启用。听起来应用程序或DLL有堆损坏或依赖于未初始化的堆内存的值
通过将环境变量\u NO\u debug\u heap
设置为1(在XP和更高版本上),可以禁用NT调试堆。这可以使应用程序在从调试器启动时不会死掉
在调试器外部启动应用程序也会导致NT调试堆被禁用,而稍后附加调试器将无法启用它。我最近不得不使用此处列出的方法之一:
这有帮助吗?如果先启动exe,然后附加调试器,会发生什么?你不能设置断点吗?我想当你用你描述的标准方式调试exe/dll时,你需要弄清崩溃的根源。虽然您可以在应用程序启动后“附加”调试器,但我不知道系统是否会突然崩溃。@Naveen:如果附加到正在运行的进程,断点将被忽略@土豚:在我要尝试的调试中断之后,我会发现的。我强烈怀疑,由于应用程序和dll都是由hope和管道胶带连接在一起的,所以我不会修复崩溃。相反,我只想提取dll的一部分,以便以合理的方式重写。在我看来,调试的调试符号(pdb文件)要么不同步,要么根本不存在。正如我在问题描述中所说,可执行文件bre