초간단 Python 디버깅

그냥 아무데서나 아래 코드를 삽입하고 실행시키면 거기서 멈춤니다.

import pdb; pdb.set_trace()

h를 입력하고 엔터를 치면, 다음과 같이 사용가능한 명령어의 모음을 보여줍니다.

(Pdb) h

Documented commands (type help <topic>):
========================================
EOF    c          d        h         list      q        rv       undisplay
a      cl         debug    help      ll        quit     s        unt
alias  clear      disable  ignore    longlist  r        source   until
args   commands   display  interact  n         restart  step     up
b      condition  down     j         next      return   tbreak   w
break  cont       enable   jump      p         retval   u        whatis
bt     continue   exit     l         pp        run      unalias  where

Miscellaneous help topics:
==========================
exec  pdb

이 상태에서 확인하고자 하는 변수를 치면, 해당 변수가 어떤 값을 가지고 있는지 보여줍니다.

(Pdb) node.next.data
1

l은 현재 내가 어디있는지 위아래 코드를 보여줍니다. l명령어에 출력할 시작 라인넘버와 끝 라인넘버를 인자로 주면 원하는 부분의 코드를 출력합니다.

(Pdb) l
 19  			node.next = Node(data)
 20
 21  		def delete(self, data):
 22  			node = self.head
 23  			import pdb; pdb.set_trace()
 24  ->			while node.next is not None:
 25  				if node.next.data == data:
 26  					node.next = node.next.next
 27  					break
 28
 29  				node = node.next

n명령어로 다음라인을 실행할수 있습니다.

(Pdb) n
> /Users/slim/test/python/linkedlist.py(25)delete()
-> if node.next.data == data:

s명령어도 마찬가지로 하나의 라인을 실행하는데, 얘는 현재 라인을 실행합니다.

(Pdb) s
> /Users/slim/test/python/linkedlist.py(29)delete()
-> node = node.next

unt명령어를 이용하면 코드의 라인넘버를 지정하여 원하는 코드까지 실행을 할수 있습니다. 일단 l명령어를 이용해서 이동하고자 하는 라인넘버를 확인한후, unt명령어에 25라는 숫자를 인자로 넘기면, 해당 25번째 코드까지 실행을 합니다.

(Pdb) l
 19  			node.next = Node(data)
 20
 21  		def delete(self, data):
 22  			node = self.head
 23  			import pdb; pdb.set_trace()
 24  ->			while node.next is not None:
 25  				if node.next.data == data:
 26  					node.next = node.next.next
 27  					break
 28
 29  				node = node.next
(Pdb) unt 25
> /Users/slim/test/python/linkedlist.py(25)delete()
-> if node.next.data == data:
(Pdb) l
 20
 21  		def delete(self, data):
 22  			node = self.head
 23  			import pdb; pdb.set_trace()
 24  			while node.next is not None:
 25  ->				if node.next.data == data:
 26  					node.next = node.next.next
 27  					break
 28
 29  				node = node.next

b명령어를 이용해서 break point를 지정하실수 있습니다. l명령어를 이용해서 break point로 지정할 라인을 확인하고, b명령어에 라인넘버를 인자로 넘겨서 break point를 지정합니다.

(Pdb) l
 20
 21  		def delete(self, data):
 22  			node = self.head
 23  			import pdb; pdb.set_trace()
 24  			while node.next is not None:
 25  ->				if node.next.data == data:
 26  					node.next = node.next.next
 27  					break
 28
 29  				node = node.next
 30
(Pdb) b 29
Breakpoint 1 at /Users/slim/test/python/linkedlist.py:29

c명령어를 이용해서 지정된 break point까지 실행합니다. l을 통해 확인을 해보면 30번째 라인까지 실행하고 while문을 통해 다시 올라가서 while문 첫번째 라인에서 다음 실행을 대기하고 있습니다.

(Pdb) c
> /Users/slim/test/python/linkedlist.py(24)delete()
-> while node.next is not None:
(Pdb) l
 19  			node.next = Node(data)
 20
 21  		def delete(self, data):
 22  			node = self.head
 23  			import pdb; pdb.set_trace()
 24  ->			while node.next is not None:
 25  				if node.next.data == data:
 26  					node.next = node.next.next
 27  					break
 28
 29  				node = node.next

이때, r을 입력하면, 현재 function 에서 return하는 부분까지 실행합니다.

(Pdb) r
--Return--
> /Users/slim/test/python/linkedlist.py(27)delete()->None
-> break

a명령어는 현재 함수를 실행하면서 받은 모든 인자를 출력합니다.

(Pdb) a
self = <__main__.LinkedList object at 0x10a4eb470>
data = 3

q를 입력하면, 디버깅을 종료합니다.

(Pdb) q
Traceback (most recent call last):
  File "linkedlist.py", line 44, in <module>
    ll.delete(2)
  File "linkedlist.py", line 24, in delete
    while node.next is not None:
  File "linkedlist.py", line 24, in delete
    while node.next is not None:
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/bdb.py", line 88, in trace_dispatch
    return self.dispatch_line(frame)
  File "/usr/local/Cellar/python/3.7.3/Frameworks/Python.framework/Versions/3.7/lib/python3.7/bdb.py", line 113, in dispatch_line
    if self.quitting: raise BdbQuit
bdb.BdbQuit

#pythondegugging #debug #debugging #파이썬디버깅