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

标签 c++ osx-mavericks interrupt lldb clang++

我试图跳出一个读行循环进入 lldb,然后从我跳出的地方继续。当我尝试使用 C-C 时,程序只是在向 lldb 发出“继续”命令后退出。

示例代码如下:

#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 或使用某种命令代替“GO INTO DEBUGGER”子句(从“assert(0)”返回很少起作用)我找到了。

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

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

最佳答案

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

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

但是,这并非特定于调试器,这可能是由于作业控制信号或您的程序可能接收到的任何其他信号而发生的。所以为了安全起见,当您从某些读取(read、select、getline 等)类型调用返回错误时,您应该检查 errno 并且仅当 errno 不是 EINTR 时才将错误视为 EOF。

话虽如此,getline 似乎有问题 w.r.t.信号。如果我在 getline 中中断程序,我得到 0 返回并且 errno 被正确设置为 4。但是下次我调用 getline 时,它​​再次返回 0,但是这次 errno 没有被重置,这使得在这种情况下很难使用。有趣...

关于c++ - 如何使用 lldb 从已停止的程序继续?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23848709/

相关文章:

c - __attribute__((__interrupt__, no_auto_psv)) 是做什么的?

c++ - 添加自定义 TensorFlow OP

c++ - 关于调用具有专门模板的类的混淆

python - Excel 无法打开 Python 生成的 CSV 文件

objective-c - MacOS 应用程序窗口内的文件管理器

以某种方式等待并抛出 InterruptedException 的 Java 方法

linux-kernel - 什么是内核定时器系统,它与调度程序有什么关系?

c++ - 使用 FreeType2 在 Eclipse CDT 中完成代码

c++ - 矩阵乘法 - Cuda 值得吗?

macos - OSXFUSE - "local"安装选项到底是什么意思?