Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何阻止C++;应用程序在执行期间调试到dll中?_C++_Visual Studio_Debugging_Dll - Fatal编程技术网

C++ 如何阻止C++;应用程序在执行期间调试到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中,但缺少exe的源代码,我如何做到这一点

< dll代码为MFC C++;我相信主应用程序也是一样的

我尝试过做一个“设置目标应用程序”的交易,在这里我设置了调用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)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