2012-02-25 3 views
2

USB 직렬 링크를 통해 마이크로 프로세서 (Arduino와 유사)에 연결하는 C++ 응용 프로그램이 있습니다. 내 시리얼 래퍼로 termios.h을 사용합니다.디버거에서 프로세스가 충돌했습니다. 어떻게해야합니까?

Mac OS X 10.7.3에서 cgdb을 사용하여 디버깅하고 있습니다.

I 때 :

  • cgdb build/my-process
  • 설정 일부 중단 점, 등, 버그를 찾거나 cgdb
내부 kill를 사용하여 여전히 실행중인 프로세스를 종료하려고 디버깅
  • 프로세스가 중단됩니다. cgdb은 프로세스를 죽이는 것을 거부합니다. 단지 거기에 있습니다. 나는 공정하게입니다. 왜냐하면 응용 프로그램의 중간에서 kill이 나오면 마이크로 컨트롤러를 통해 액세스하는 장치 인 /dev/ttyUSB 장치를 출시하지 않기 때문입니다. 무언가가 잠기고 결코 잠기지 않는다면 확실하지 않지만, cgdb은 결코 빠져 나올 수 없습니다.

    이 나는 ​​시도했다 :

    • 기본 인터럽트 : Ctrl 키 + C
    • ps aux | grep 'my-process', 죽일 -9 [PID]`.
    • ps aux | grep cgdb, kill -9 [pid].
    • sudo 상기 버전.

    아무 것도 cgdb 또는 실행중인 프로세스를 죽이지 않습니다.

    USB 케이블 (마이크로 프로세서 연결 종료)을 제거하면 (충돌 한 프로세스가 중단 될 수 있다고 생각 했음) 사용할 수있는 CPU가 50 % 가량 사용되기 시작하고 모든 것이 잠기고 있습니다. I 응용 프로그램을 크래시하지 마십시오.

    당신이 할 방법 : cgdb 또는 gdb에서 모든 것을 잠금없이 깨끗하게 의 (a) 종료하는 동안 프로세스를 또는 (b)의 킬/깨끗하게 (비록 '깔끔하게'디버깅의 중간에 단지 것 케이크에 장식) 당신이 그것을 디버깅하는 동안 중지 된 프로세스를 중지 없이 응답을 응답?

  • 답변

    5

    I/O 대기중인 프로세스를 종료 할 수 없습니다. 그것은 신기원의 새벽부터 모든 유닉스 커널이 아니더라도 대부분의 경우에 해당됩니다.

    I/O 대기 상태에서 멈추는 디버거 (또는 다른 프로세스)가 죽을 수도 있습니다.나는 "pgrep을 -l cgdb"PID를 나열하는 매우 편리 시도 할 것

    +0

    내가 나는 철저하게 죽일 수없는 경우, 타임 아웃 또는 유사한를 설정할 수 있습니까? – simont

    +0

    아니요, 본질적으로 무정전 상태입니다. 상태를 벗어나는 유일한 방법은 커널 I/O 작업을 성공적으로 완료하도록하는 것입니다. – smparkes

    +0

    그것은 약간의 고통입니다 - 고마워요. 나는 며칠 동안 어리석은 것을 죽이는 법을 알아 내려고 고개를 숙이고 있었다. – simont

    0

    의 ptrace 또는 pgrep을 ...

    관련 문제