[python] pdb: 파이썬 디버거

markyang92·2021년 8월 8일
0

python

목록 보기
21/42
post-thumbnail
post-custom-banner

pdb

  • GNU gdb처럼 파이썬엔 pdb Python Debugger 모듈을 제공한다.
    • gdb와 명령어가 상당이 비슷해서 gdb를 사용하던 사람들은 쓸만하다.
  • 기본적으로 제공된다.

실행

$ python -m pdb <python.py>

  • gdb 처럼 한줄 한줄 명령어로 실행한다.

option, argument

python3 -m pdb myscript.py -o val

명령 list

디버거 명령들

  • h(elp)h로 사용할 수 있음
  • argument는 반드시 명령과 공백(스페이스, 탭)으로 구분
    • optional argument는 [ ]
  • l(ist) 실행 후, enter를 눌리면, 그 다음의 11줄이 출력됨
  • 파이썬 문장 앞에 !를 붙여서 사용할 수 있음
  • 한 줄의 여러 명령은 ;;로 구분할 수 있음
command                                                                  description
h(elp) [command]
  • 인자가 없는 경우: 사용 가능한 명령 리스트를 출력
  • command가 주어진 경우: 해당 명령의 도움말을 출력
  • w(here)
  • 가장 최근 프레임을 맨 아래로 하는 스택 트레이스를 출력
  • d(own) [count]
  • 스택 트레이스에서 현재 프레임을 count (기본 1) 단계 아래로 (새로운 프레임으로) 이동
  • u(p) [count]
  • 스택 트레이스에서 현재 프레임을 count (기본 1) 단계 위로 (이전 프레임으로) 이동
  • b [([filename:]lineno | function) [, condition]]
  • lineno인자가 주어진 경우: 현재 파일의 해당 줄 번호에 브레이크를 설정
  • function 인자가 주어진 경우: 함수 내에서 첫 번째 실행 가능한 문장에서 브레이크를 설정
    • 줄 번호는 다른 파일 (아마도 아직 로드되지 않은 파일)에 중단점을 지정하기 위해, 파일명과 콜론을 접두사로 사용할 수 있다.
    • 파일은 sys.path 에서 검색
  • 주의할 점은 각 중단점에 번호가 지정되며, 다른 모든 중단점 명령이 그 번호를 참조하게 된다.
  • 두 번째 인자가 있는 경우, 중단점을 적용하기 전에 표현식이 반드시 참이어야 함
  • 인자가 없다면, 각 중단점, 중단점에 도달한 횟수, 현재까지 무시 횟수, 그리고 관련 조건(있는 경우)을 포함한 모든 중단지점을 나열
  • tbreak [([filename:]lineno | function) [, condition]]
  • 한번 도달하면 제거되는 임시중단점
  • 인자는 break과 동일
  • cl(ear) [filename:lineno | bpnumber ...]
  • filename:lineno 인자가 주어진 경우, 해당 줄에 있는 모든 중단점을 제거
  • 공백으로 구분된 중단점 번호 배열이 주어진 경우, 해당 중단점을 제거
  • 인자가 없는 경우, 모든 중단지점을 재차 확인 후 제거
  • disable [bpnumber ...]
  • 공백으로 구분된 중단점 번호로 해당 중단점을 비활성화
  • 중단점을 비활성화하는 것은 프로그램이 실행을 중단할 수 없다는 것이다.
    • 하지만 중단점을 제거하는 것과는 달리, 중단점 목록에 남아있으며 (재-)활성화할 수 있다.
    enable [bpnumber ...]
  • 지정된 중단점을 활성화
  • ignore bpnumber [count]
  • 해당 중단점 번호를 무시할 횟수를 설정
  • 만약 횟수가 생략된 경우, 무시 횟수는 0으로 설정
  • 무시 횟수가 0일 때 중단점이 활성화
  • 0이 아닐 때는, 중단점에 도달하고 중단점이 비활성화되지 않고 연관 조건이 참일 때마다 그 횟수가 차감
  • condition bpnumber [condition]
  • 중단점에 새로운 condition을 설정
  • 표현식이 참일 때만 중단점이 적용
  • 만약 condition이 없다면, 설정되어있던 모든 조건이 제거
    • 즉, 중단점에 적용되어있던 조건이 없어짐
    commands [bpnumber]
  • 중단점 번호 bpnumber 에 대한 명령을 지정
  • 명령 목록은 다음 줄에 나타나게 된다.
  • 명령을 종료하려면 end만 입력하면 된다.
  • 중단점에 지정된 모든 명령을 제거하려면, commands 입력 후에 바로 end 입력하면된다. 즉, 아무 명령을 설정하지 않는 것
  • bpnumber 인자가 주어지지 않으면, commands는 마지막 중단점 묶음을 참조하게 된다.
  • 중단점 명령을 활용해서 프로그램을 다시 시작할 수도 있다.. continue 명령이나, step 또는 실행을 재개하는 다른 명령을 사용하기만 하면 된다.
  • 실행을 재개하는 아무 명령 (continue, step, next, return, jump, quit 및 해당 명령의 약어들)을 지정하는 것은 (end 명령을 붙인 것처럼) 해당 명령 목록을 끝내는 것.
    • 왜냐하면 실행을 재개할 때마다, 명령 목록을 가진 다른 중단점을 맞이할 수 있고, 어떤 목록을 실행해야 할지 모르는 상황이 생기기 때문.
    • 만약 slient 명령을 사용하면, 중단점에서 멈출 때 나오는 메시지는 출력 않는다. 특정 메시지를 출력하고 진행되는 중단점에 바람직할 수 있. 다만 그 어떤 명령도 출력하지 않는다면, 그 중단점에 도달했다는 것은 알 수 없다.
    s(tep)
  • 현재 줄을 실행하고, 멈출 수 있는 가장 첫 번째 줄(호출되는 함수 또는 현재 함수의 다음 줄) 에서 멈춘다.
  • n(ext)
  • 현재 함수의 다음 줄에 도달하거나, 반환할 때까지 계속 실행한다. next와 step의 차이점은 step은 호출된 함수 안에서 멈추고, next는 호출된 함수를 재빠르게 실행하고 현재 함수의 바로 다음 줄에서만 멈춘다.
  • unt(il) [lineno]
  • 인자가 없는 경우: 현재 줄 번호보다 높은 줄 번호에 도달할 때까지 계속 실행
  • 줄 번호가 주어진 경우: 해당 번호보다 크거나 같은 줄에 도달할 때까지 계속 실행.
  • 두 경우 모두 현재 프레임이 반환될 때 멈춥니다.

    r(eturn)현재 함수가 반환될 때까지 계속 실행
    c(ont(inue))중단점을 마주칠 때까지 계속 실행
    j(ump) lineno다음으로 실행될 줄을 설정
  • 프레임의 맨 마지막에서만 실행이 가능
  • 이전 줄로 돌아가 코드를 재실행하거나, 실행을 원치 않는 코드를 건너뛸 수 있다.
  • 중요한 점은 이 명령은 언제나 실행할 수 있진 않습니다 -- for 루프 내부로 들어가거나 finally 절을 건너뛰는 것은 불가능합니다.

    l(ist) [first[, last]]
  • 현재 파일의 소스 코드를 나열
    • 인자가 없는 경우: 현재 줄 주위로 11줄을 나열하거나 이전 줄을 이어서 나열
    • 인자로 .을 입력한 경우: 현재 줄 주위로 11줄을 나열
    • 한 인자만 주어진 경우: 해당 줄 주위로 11줄을 나열합니다
    • 두 인자가 주어진 경우: 두 인자 사이의 모든 줄을 나열; 만약 두 번째 인자가 첫 번째 인자보다 작은 경우, 첫 번째 인자로부터 나열하는 줄 수로 인식
  • 현재 프레임에서 현재 위치는 ->로 표시. 예외를 디버깅할 때, 예외가 최초로 발생하거나 전파된 줄이 현재 줄과 다른 경우에는 >>로 표시
  • ll | longlist현재 함수나 프레임의 소스 코드 전체를 나열
    참고할만한 줄은 list처럼 표시
    a(rgs)현재 함수의 인자 목록을 출력
    p expression현재 컨텍스트에서 expression을 실행하고 값을 출력
    print()파이썬의 print() 함수를 실행
    pp expressionp 명령과 비슷하지만, 표현식의 값을 pprint 모듈을 활용하여 보기 좋은 형태로 출력
    whatis expressionexpression의 형(type)을 출력
    source expression주어진 객체의 소스 코드를 가져와서 보여줌
    display [expression]
  • 현재 프레임에서 실행이 중지될 때마다, 표현식의 값이 변경된 경우 표시
  • 표현식이 주어지지 않은 경우: 현재 프레임에서 표시되는 모든 표현식을 나열
  • undisplay [expression]현재 프레임에서 표현식을 더는 표시하지 않는다. 표현식이 주어지지 않은 경우, 현재 프레임에서 표시되는 모든 표현식을 제거합니다.
    interact현재 스코프에서 찾을 수 있는 모든 지역 또는 전역 이름을 담고 있는 전역 이름 공간을 가진 (code 모듈을 활용하는) 대화형 인터프리터를 시작합니다.
    alias [name [command]]
    unalias name지정된 에일리어스를 제거합니다.
    ! statement현재 스택 프레임의 컨텍스트에서 단일 statement를 실행
    문장의 첫 단어가 디버거 명령이 아닌 경우, 느낌표는 제외해도 된다.
    전역 변수를 설정하려면 실행하려는 명령과 동일한 줄 맨 앞에 global문장을 붙이면 된다.
    run [args ...]
    restart [args ...]
  • 디버그 된 파이썬 프로그램을 재시작
    • 만약 인자가 주어진 경우, shlex으로 나뉘게 되고 결과는 새 sys.argv로 사용된다.
    • 이전 기록, 중단점, 행동 그리고 디버거 옵션은 유지
  • restart는 run의 에일리어스입니다.
  • q(uit)디버거를 종료
    debug codecode 인자(현재 환경에서 실행될 임의의 표현식이나 문장)를 단계별로 수행하는 재귀적 디버거에 진입
    retval함수의 마지막 반환에 대한 반환 값을 프린트

    h: help

    (Pdb) h
    • help

    '엔터': 이전 명령어 재 수행


    n: 행 수행(like-f10)

    • Visual Studio의 f10 처럼 현재 행 실행

    s: 행 진입(like-f11)

    • Visual Studio의 f11 처럼 현재 행 실행하고 프로시저 진입

    l : list -> 실행 전

    • 현재 실행되는 라인 리스트 출력

    w: 스택 프레임 출력

    • w: 가장 최근 프레임을 맨 아래로 하는 스택 트레이스 출력.

    u: 스택 하나 업


    d: 스택 하나 다운


    r : 현 함수 리턴 직전까지 실행


    p [VAR]: VAR 표시

    (Pdb) p [VAR]

    display

    display [VAR]

    (Pdb) display [VAR]
    • VAR을 display에 셋팅한다.

    display

    • display set한 변수의 현재 값을 출력한다.

    ! VAR=value: 변수에 값 재설정

    (Pdb) ! VAR=value

    breakpoint

    b: 현재 bp show

    (Pdb) b
    • 현재 bp들을 show

    b [라인 번호]: '라인 번호'에 bp

    (Pdb) b [line_number]
    • [line_number]Break Point라인 번호를 찍으면 해당 라인에 bp가 걸린다.

    cl: clear,


    c: 다음 bp까지 실행

    (Pdb) c
    profile
    pllpokko@alumni.kaist.ac.kr
    post-custom-banner

    0개의 댓글