Отладчик Python: Продвижение в функцию, которую Вы вызвали в интерактивном режиме

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
52
задан Martijn Pieters 30 March 2015 в 00:25
поделиться

5 ответов

И я ответил на свой собственный вопрос! Это - команда "отладки" в pydb:

~> cat -n /tmp/test_python.py
     1  #!/usr/local/bin/python
     2
     3  def foo():
     4      print "hi"
     5      print "bye"
     6
     7  exit(0)
     8

~> pydb /tmp/test_python.py
(/tmp/test_python.py:7):  <module>
7 exit(0)


(Pydb) debug foo()
ENTERING RECURSIVE DEBUGGER
------------------------Call level 11
(/tmp/test_python.py:3):  foo
3 def foo():

((Pydb)) s
(/tmp/test_python.py:4):  foo
4     print "hi"

((Pydb)) s
hi
(/tmp/test_python.py:5):  foo
5     print "bye"


((Pydb)) s
bye
------------------------Return from level 11 (<type 'NoneType'>)
----------------------Return from level 10 (<type 'NoneType'>)
LEAVING RECURSIVE DEBUGGER
(/tmp/test_python.py:7):  <module>
41
ответ дан 7 November 2019 в 09:30
поделиться

Можно в интерактивном режиме отладить функцию с pdb также, предоставил сценарий, который Вы хотите отладить, не выходит () в конце:

$ cat test.py
#!/usr/bin/python

def foo(f, g):
        h = f+g
        print h
        return 2*f

Для отладки запустите интерактивную сессию Python и импортируйте pdb:

$ python
Python 2.5.1 (r251:54869, Apr 18 2007, 22:08:04) 
[GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import pdb
>>> import test
>>> pdb.runcall(test.foo, 1, 2)
> /Users/simon/Desktop/test.py(4)foo()
-> h = f+g
(Pdb) n
> /Users/simon/Desktop/test.py(5)foo()
-> print h
(Pdb) 

pdb модуль идет с Python и документируется в документы модулей в http://docs.python.org/modindex.html

20
ответ дан Simon 7 November 2019 в 09:30
поделиться

Существует отладчик Python, который является частью базового распределения Python, названного 'pdb'. Я редко использую его сам, но нахожу его полезным иногда.

, Учитывая эту программу:

def foo():
    a = 0
    print "hi"

    a += 1

    print "bye"

foo()

Вот сессия, отлаживая его:

$ python /usr/lib/python2.5/pdb.py /var/tmp/pdbtest.py         ~
> /var/tmp/pdbtest.py(2)<module>()
-> def foo():
(Pdb) s
> /var/tmp/pdbtest.py(10)<module>()
-> foo()
(Pdb) s
--Call--
> /var/tmp/pdbtest.py(2)foo()
-> def foo():
(Pdb) s
> /var/tmp/pdbtest.py(3)foo()
-> a = 0
(Pdb) s
> /var/tmp/pdbtest.py(4)foo()
-> print "hi"
(Pdb) print a
0
(Pdb) s
hi
> /var/tmp/pdbtest.py(6)foo()
-> a += 1
(Pdb) s
> /var/tmp/pdbtest.py(8)foo()
-> print "bye"
(Pdb) print a
1
(Pdb) s
bye
--Return--
> /var/tmp/pdbtest.py(8)foo()->None
-> print "bye"
(Pdb) s
--Return--
> /var/tmp/pdbtest.py(10)<module>()->None
-> foo()
(Pdb) s
4
ответ дан Jerub 7 November 2019 в 09:30
поделиться

Если Вы более знакомы с отладчиком GUI, существует winpdb ('победа' в этом случае не обращается к Windows). Я на самом деле использую его на Linux.

На debian/ubuntu:

sudo aptitude install winpdb

Тогда просто помещает это в Ваш код, где Вы хотите, чтобы он повредился:

import rpdb2; rpdb2.start_embedded_debugger_interactive_password()

Тогда запускают winpdb и присоединение к Вашему под управлением сценарию.

3
ответ дан Jeremy Cantrell 7 November 2019 в 09:30
поделиться

Для интерактивной работы над кодом я разрабатываю, я обычно нахожу более эффективным установить программируемую "точку останова" в самом коде с pdb.set_trace. Это делает его easir для повреждения на состоянии программы глубоко в цикл, также: if <state>: pdb.set_trace()

2
ответ дан Alex Coventry 7 November 2019 в 09:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: