2014-09-22 5 views
29

줄을 평가하기 위해 n을 치고 나자, 나는 돌아가서 실패했을 때 그 함수로 들어 가려고한다. 이것이 가능한가?pdb에서 뒤로 이동할 수 있습니까?

워드 프로세서 말 :

J (UMP) LINENO 이 실행됩니다 다음 라인을 설정합니다. 맨 아래 프레임에서만 사용할 수 있습니다. 이렇게하면 뒤로 건너 뛰고 코드를 다시 실행하거나 실행하지 않으려는 코드를 건너 뛸 수 있습니다.

+4

아니요. PDB는 시간을 되돌릴 수 없습니다. –

+0

@MartijnPieters가 제 편집문을 보았습니다. 문서에서 다시 한 줄로 이동할 수 있다고해서이 작업을 수행하거나 이전 줄로 어떻게 든 돌아갈 수는 없습니까? – YPCrumble

+0

실패한 함수로 돌아가서 실패를 일으킨 상태를 복원하는 작업은 두 가지가 있습니다. –

답변

22

GNU 디버거, gdb : 한 번에 하나의 기계 명령어를 실행 취소하므로 속도가 매우 느립니다.

파이썬 디버거 인 pdb : jump 명령은 코드에서 뒤로 이동하지만 프로그램 상태를 되돌려주지 않습니다.

파이썬의 경우, 확장 된 파이썬 디버거 프로토 타입 epdb가 이러한 이유로 생성되었습니다. thesis은 여기에 program and the code입니다.

필자는 MSDB 학위의 일부로 라이브 역 디버거를 만들기 위해 epdb를 시작점으로 사용했습니다. 논문은 온라인 : Combining reverse debugging and live programming towards visual thinking in computer programming. 1 장과 2 장에서 나는 디버깅을 역전시키는 역사적인 접근법에 대해서도 다뤘다.

+0

논문은 정말 좋아 보인다! 나는 그것을 자세히 읽지는 않았지만 당신이 전문가 인 것처럼 : 지금까지이 문제에서 언급 된 해결책에 대해 어떻게 생각합니까? 귀하의 epdb 대 [timetravelpdb] (https://github.com/TomOnTime/timetravelpdb) 대 [PyDB의 revdb] (https://morepypy.blogspot.com.au/2016/07/reverse-debugging-for-python. HTML)? – ShreevatsaR

+1

@ShreevatsaR 당신이 언급하고있는 논문, 패트릭 세이빈 (Patrick Sabin)의 앞선 epdb 논문, 또는 후기의 논문 (위의 두 논문 모두)은 확실하지 않습니다. 역방향 디버깅 개발을 2 년 넘게 지켜 보지 못했습니다. 빠른보기 후에 : timetravelpdb는 epdb와 매우 유사하지만 기능이 적습니다. epdb는 프로그램 상태뿐만 아니라 외부/환경 상태 (어느 정도)를 관리하여 결정론을 보장합니다. Revdb는 기록 재생 방식을 사용하며 외부 상태를 관리하지 않는 것 같습니다. 필자의 논문에서 설명한 바와 같이, 기록 재생 및 스냅 샷 (선호) 접근법 모두 장점이 있습니다. – Abraham

+0

고마워요! 도움이됩니다. – ShreevatsaR

9

역 디버깅 (이전에 기록 된 응용 프로그램 상태로 되돌리기 또는 단일 단계 스테핑 디버깅)은 일반적으로 어셈블리 또는 C 수준 디버거 기능입니다. 예 : GDB는 그것을 할 수 있습니다 :

https://sourceware.org/gdb/wiki/ReverseDebug

Bidirectional (or reverse) debugging

Reverse debugging is utterly complex, and may have performance penalty of 50.000x합니다. 또한 디버깅 도구를 광범위하게 지원해야합니다. 파이썬 가상 머신은 역 디버깅을 지원하지 않습니다.

대화식으로 Python 코드를 평가하는 경우 HTML 기반 대화 형 Python 셸을 제공하는 IPython Notebook을 사용하는 것이 좋습니다. 쉽게 코드를 작성하고 순서를 섞어서 일치시킬 수 있습니다. 그러나 pdb 디버깅 지원은 없습니다. ipdb은 입력 된 디버깅 명령에 대한 더 나은 기록 및 검색 기능을 제공하지만 직접 역방향 점프를 아는 한 수행하지 않습니다.

6

PyPy는 역 디버깅을 지원하는 RevDB을 구현하기 시작했습니다.

알파 단계에서 여전히 Python 2.7 만 지원하며 Linux 또는 OS X에서만 작동하며 특별한 개정판에서 직접 Python을 빌드해야합니다. 또한 매우 느리고 많은 RAM을 사용합니다. Bitbucket 페이지를 인용하려면 다음과 같이하십시오.

일반적으로 로그 파일은 초당 1-2MB의 속도로 증가합니다. 크기가 문제가되지 않는다고 가정하면 제한 요소는 다음과 같습니다.

  • 재생 시간. 기록 된 실행이 몇 분 이상 걸리면 재생이 힘들어집니다. 때로는 단일 세션에서 여러 번 전체 로그를 검토해야합니다. 버그가 무작위로 발생하지만 거의 발생하지 않으면 몇 분 동안 기록을 실행 한 다음 프로세스를 종료하고 충돌이 발생할 때까지 반복해서 시도해야합니다.
  • 재생을위한 RAM 사용량. RAM 요구 사항은 레코딩보다 재생시 10 배 또는 15 배 더 큽니다.이것이 너무 많으면 _revdb/process.py에서 MAX_SUBPROCESSES에 대해 더 낮은 값으로 시도 할 수 있지만 항상 몇 배 더 커야합니다.

세부 사항은 PyPy blog에 있으며 설치 및 사용 지침은 RevDB bitbucket page에 있습니다.

관련 문제