2014-05-24 1 views
0

나는 lldb에 대한 읽기 - 라인 루프를 벗어나고 나서 내가 어디에서 벗어 났는지 계속하려고 노력 중이다. C-C를 사용하려고하면 "continue"명령이 lldb에 주어진 후에 프로그램이 종료됩니다. 이 프로그램이 실행되면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 메시지로 끝냅니다.

CC를 사용하거나 "GO INTO DEBUGGER"절 대신 "assert (0)"에서 거의 반환하지 않는 명령을 사용하여 루프가 중단되었을 때 루프로 돌아갈 수 있습니까? 내가 찾을 작동

모든 맥 매버릭스에 그 소리 ++로 컴파일

참고 :.. lldb 백 트레이스가 난 CC가 SIGINT라고 생각 SIGSTOP을 받았지만, 나는 오래된 것 같아라고 몇 가지 이유

답변

2

이러한 종류의 문제는 신호와 시스템 트랩 간의 상호 작용으로 인해 발생합니다. 입력을 기다리는 시스템 트랩에있는 프로그램 (또는 시스템 트랩에서 실제로)이 신호를 받으면 시스템은 신호를 전달하기 위해 커널에서 트랩에있는 스레드를 커널 밖으로 가져와야 할 수 있습니다 . 그렇게해야만하는 경우 트랩 호출은 일반적인 오류 값과 함께 반환되며 스레드 로컬 "errno"변수는 EINTR로 설정됩니다.

디버거가 프로그램을 방해하기 위해 디버거가 신호를 보내야하기 때문에 (lldb가 SIGINT보다는 SIGINT를 사용하여 흥미로운 이유로 신호를 보내야하기 때문에) 디버거에서 발생합니다.

그러나 이것은 디버거에만 해당되는 것이 아니며 작업 제어 신호 또는 프로그램에서받을 수있는 다른 신호로 인해 발생할 수 있습니다. 따라서, read (read, select, getline, etc ...) 타입의 호출로부터 에러가 돌아 오면, errno가 EINTR이 아닌 경우 errno를 체크하고 EOF로만 에러를 처리해야합니다.

getline은 버그가있는 것처럼 보입니다. 신호. getline에 앉아있는 동안 프로그램을 중단하면 0으로 돌아가고 errno는 4로 올바르게 설정됩니다.하지만 다음에 getline을 호출하면 다시 0으로 반환되지만 이번에는 errno가 재설정되지 않습니다. 이런 맥락에서 사용하는 것은 어렵습니다. 재미있는 ...

+0

흥미 롭습니다.그런데 gdb에서와 같은 동작이 예상됩니다. – kdog

0

Control-C를 사용하여 프로그램을 중지하는 대신 lldb에 중단 점을 사용해야합니다. 프로그램에 연결하면, 실행을 시작하기 전에, 당신은 입력하여 중단 점을 설정할 수 있습니다

break foo.c:11 

자세한 내용은 라인 (11) See the docs의 파일 foo.c를에서 휴식. 디버거가 중단 점에서 중지되면

, 사용자가 입력 한 후, 변수를 검사하고 다른 작업을 수행 할 수 있습니다

continue 

프로그램의 실행을 계속합니다.

+0

런타임시 프로그램 출력을 기반으로 프로그램을 직접 중단 할시기를 결정해야합니다. 나는 항상 특정 시점에서 멈추지 않는다. 따라서이 솔루션은 적용 할 수 없습니다. – kdog