2012-06-12 109 views
0

我试图通过我没有写的程序代码(我有源代码)。它是一个小型的http服务器。我能够放置断点,并且在从main()的线性路径中运行的任何点都会受到尊重。但是,当我尝试在响应浏览器连接而被调用的行放置断点时,它只是被忽略。调试套接字服务器代码

有什么我不知道调试套接字代码?我对套接字编程知之甚少,但这不是我想要看到的部分。

这是用Visual C++ 2010

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

回答

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取决于已安装的异常处理程序的类型和/或系统函数调用是否设置为隐藏崩溃。