C++ 如何使用lldb从已停止的程序继续?

C++ 如何使用lldb从已停止的程序继续?,c++,osx-mavericks,interrupt,lldb,clang++,C++,Osx Mavericks,Interrupt,Lldb,Clang++,我试图打破读线循环进入lldb,然后继续我打破的地方。当我尝试使用C-C时,程序只是在向lldb发出continue命令后退出 以下是示例代码: #include<iostream> #include<string> using namespace std; int main(){ string cmd; while(true){ if (!getline(cin,cmd)) { cout<<"ending on eof"<&

我试图打破读线循环进入lldb,然后继续我打破的地方。当我尝试使用C-C时,程序只是在向lldb发出continue命令后退出

以下是示例代码:

#include<iostream>
#include<string>
using namespace std;
int main(){
  string cmd;
  while(true){
    if (!getline(cin,cmd)) {
      cout<<"ending on eof"<<endl;
      break;}
    else if (cmd=="GO INTO DEBUGGER"){
      //??
    }
    else 
      cout<<"Got line: "<<cmd<<endl;
  }
  cout<<"Exiting program"<<endl;
  return 0;
};
当这个程序被执行时,它只是回显输入行。当我使用C-C中断程序时,我会跳回调试器。然后,当我在调试器中执行continue时,我没有返回到循环,而是带着EOF消息退出

如何从循环被中断时返回到循环,或者使用C-C,或者使用某种命令代替从assert0返回的GO-INTO DEBUGGER子句,我发现这种方法很少奏效

这些都是在Mac Mavericks上用clang++编译的


注意:由于某些原因,lldb回溯说它收到了SIGSTOP,我以为C-C是SIGINT,但我想我已经过时了。

与其使用Control-C停止程序,不如在lldb中使用断点。连接到程序时,在开始执行之前,可以通过键入以下内容设置断点:

break foo.c:11
在第11行中插入foo.c文件。了解更多信息

调试器在断点处停止后,可以检查变量并执行其他操作,然后键入:

continue

继续执行程序。

这种问题是由于信号和系统陷阱之间的相互作用造成的。 当位于系统陷阱中等待输入的程序或任何系统陷阱中的程序确实收到信号时,系统可能需要将位于陷阱上的线程从内核中取出,以便将信号传递给它。如果必须这样做,陷阱调用将返回其通常的错误值,线程本地errno变量将设置为EINTR

在调试器中发生这种情况是因为调试器必须发送一个信号,lldb出于无趣的原因使用SIGSTOP而不是SIGINT来中断程序

但是,这不是特定于调试器的,这可能是因为作业控制信号或程序可能接收到的任何其他信号。所以为了安全起见,当您从一些读取、选择、获取行等返回错误时。。。键入call,您应该检查errno,并且仅当errno不是EINTR时才将错误视为EOF


话虽如此,getline似乎是有车的w.r.t.信号。如果我在程序位于getline时中断它,我会得到一个0返回值,并且errno被正确设置为4。但是下次我调用getline时,它再次返回0,但是这次errno没有被重置,这使得它在这个上下文中很难使用。有趣的…

我需要根据运行时的程序输出自行决定何时停止程序。我并不总是在某个特定的点上停下来。因此,这个解决方案是不适用的。顺便说一下,gdb中的行为与预期的一样。