문제

대본:

손으로 시작하기가 성가신 복잡한 소프트웨어가 있습니다. 내가 한 일은 실행 파일을 시작하고 첨부하기 위해 파이썬 스크립트를 만드는 것입니다. GDB 디버깅을 위해.

프로세스 시작 스크립트 :

  • 환경 변수가 설정되었는지 확인하십시오.
  • 로컬 빌드 디렉토리가 환경에 추가되도록합니다. LD_LIBRARY_PATH 변하기 쉬운.
  • 현재 작업 디렉토리를 실행 파일이 예상되는 위치로 변경합니다 (내 디자인이 아님)
  • 구성 파일로 실행 파일을 시작합니다.
  • 실행 파일에서 두 번째 로깅 프로세스로의 출력 파이프
  • 실행 파일의 PID를 기억 한 다음 GDB를 실행 가능한 실행 파일에 시작하고 첨부합니다.

스크립트는 하나의 경고와 함께 작동합니다. Ctrl-C는 데그 버전을 방해하지 않고 GDB로 돌아 오지 않습니다. 따라서 활성 중단 점으로 "계속"하면 프로세스를 다시는 멈출 수 없으며 다른 쉘에서 죽이거나 방해해야합니다. Btw, 실행 "kill -s sigintu003Cpid> " 어디u003Cpid> Debuggee의 PID가 GDB의 프롬프트로 돌아가게 하는가 ... 이런 식으로 일을해야한다는 것은 정말 성가신 일입니다.

처음에 나는 Python이 Sigint 신호를 잡고 있다고 생각했지만 신호 핸들러를 설정하여 신호를 Debugee로 전달하여 문제를 해결하지 못하는 것처럼 보이지는 않습니다.

Python 스크립트 (하위 프로세스 대신 OS.Spawn* 호출)에 대한 다양한 구성을 시도했습니다. Python이 어린이 프로세스를 시작하면 Sigint (CTRL-C) 신호가 그렇지 않습니다. GDB 또는 아동 과정으로 라우팅하십시오.

현재 사고 라인

  • 이것은 Debugee & GDB에 대한 별도의 프로세스 그룹 ID가 필요할 수 있습니다 ... 이것에 대한 신뢰가 있습니까?
  • Selinux와 함께 가능한 버그?

정보 :

  • GDB 6.8
  • Python 2.5.2 (Python 2.6.1과 함께하는 문제)
  • Selinux 환경 (프로세스에 신호를 전달하는 버그?)

내가 고려한 대안 :

  • 스크립트의 많은 작업을 수행하도록 .gdbinit 파일을 설정하면 환경 변수 및 현재 작업 디렉토리 가이 접근법의 문제입니다.
  • 실행 파일 시작 및 GDB 부착 수동 (Yuck)

의문:대규모 프로젝트의 시작/디버깅을 어떻게 자동화합니까?

업데이트:나는 아래에서 Nicholas Riley의 예제를 시도했습니다. 집에서 Macintosh에서 CNTL-C가 Varrying Degree, Production Boxen (지금은 Selinux를 실행할 수 있음)에서 일할 수 있도록 허용합니다.

도움이 되었습니까?

해결책

신호를 파이썬에서 디버그로 전달하는 대신 무시할 수 있습니다. 다음은 저를 위해 일했습니다.

import signal
signal.signal(signal.SIGINT, signal.SIG_IGN)

import subprocess
cat = subprocess.Popen(['cat'])
subprocess.call(['gdb', '--pid=%d' % cat.pid])

이것으로 나는 GDB 내부에서 반복적으로 ^c를 할 수 있었고 문제없이 디버그를 방해 할 수 있었지만 이상한 행동을 보았습니다.

또한 신호를 대상 프로세스로 전달할 때도 아무런 문제가 없었습니다.

import subprocess
cat = subprocess.Popen(['cat'])

import signal, os
signal.signal(signal.SIGINT,
              lambda signum, frame: os.kill(cat.pid, signum))

subprocess.call(['gdb', '--pid=%d' % cat.pid])

그래서, 당신의 경우에 다른 일이 일어나고 있습니까? 중단되는 코드를 게시하면 도움이 될 수 있습니다.

다른 팁

귀하의 의견은 Putty와 함께 속임수를 쓰고 있다고 말합니다 ... 통제 TTY가 있습니까? OpenSsh를 사용하면 -t 옵션을 추가하고 싶을 것입니다. Putty가 사용하는 방식으로 Putty가 어떻게 수행하는지 모르겠습니다.

또한 : Putty 대신 Cygwin의 SSH를 사용해 볼 수도 있습니다.

이 작업을 수행하기 위해 현재 스크립트가 이미 설정되어 있지만 일부를 자동화하는 데 문제가있는 경우, 기대를 잡아서 설정을 제공하는 데 사용하여 프로세스를 시작할 것으로 예상되는 대화식 모드로 다시 떨어 뜨릴 수 있습니다. 그런 다음 여전히 CTRL-C를 방해 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top