0

我正在尝试逐步完成我没有编写的程序的代码(我有源代码)。它是一个小型 http 服务器。我能够放置断点,并且它们将在从main(). 但是,当我尝试在响应来自浏览器的连接而调用的行上放置断点时,它会被忽略。

关于调试套接字代码有什么我不知道的吗?我真的不太了解套接字编程,但这不是我想要看到的部分。

这适用于 Visual C++ 2010。

编辑
我发现了问题。有一个深度嵌套的调用system实际上是用不同的参数再次运行程序。所以它不是线程或套接字或其他什么,它实际上是一个全新的子进程。有没有办法让调试器继续这个?

4

1 回答 1

1

选项1

更改您的“系统”调用以将“--waitfordebugger”参数传递给子进程。然后在 main 或 WinMain 中,检查为此参数传递的命令行参数。如果检测到,使您的代码进入无限循环。

volatile int x = false;
while (x == false)
{
    Sleep(100);
}

当您的子进程生成时,使用 Visual Studio 将“附加”到子进程(顶级菜单,选择“调试”和“附加到进程...”)。然后在 Sleep 语句上设置一个断点。当断点被命中时(应该是立即的),将监视窗口中的“x”更改为 true,将新断点设置到代码中要单步执行的位置。然后按“继续”(F5) 键让程序继续。

此技术还有其他变体,包括使用等待 IsDebuggerPresent() API 返回 TRUE。

选项 2

在代码中要调试的位置附近,插入 DebugBreak() 语句。这通常会创建弹出打开的崩溃对话框。如果它提示您附加调试器,请让它。否则,只需按照选项 1 中的说明直接附加调试器,然后按崩溃对话框上的相应按钮继续。这种方法的 YMMV 取决于已安装的异常处理程序类型和/或系统函数调用是否设置为隐藏崩溃。

于 2012-06-13T06:35:23.610 回答