精华内容
下载资源
问答
  • 常用的程序调试方法

    千次阅读 2013-09-03 22:23:11
    常用的调试方法有:断点调试,值调试,Watch调试,内存调试,打印调试,以及查看堆栈信息等。断言调试,DEbug版本调试。 程序的调试就是程序的排错和查错。对于自己的写程序一定要养成一个良好的性格,认真和谨慎。...

    常用的调试方法有:断点调试,值调试,Watch调试,内存调试,打印调试,以及查看堆栈信息等。断言调试,DEbug版本调试。

    程序的调试就是程序的排错和查错。对于自己的写程序一定要养成一个良好的性格,认真和谨慎。

    好的习惯有:

    1.结构化的编程,2,增加有助于理解的注释;3,在函数的传递过程中,注意参数的变化,尽量的减少函数之间的耦合,增强内聚;

    常见的程序错误分析方法:

    1.从程序的流程入手,分析此程序运行的过程是否正确,有的语句是否执行了,可以在相关的信息语句中加上打印信息来确认下;

    2.从打印的信息入手,减少排错程序的区间,缩小查找程序的位置;

    3.使用条件编译的方法,查找程序错误,这样可以提高效率,使用:#if 0 #endif注释掉相关的程序,这样可以提高找错的效率;

    4.若程序的流程没有问题,则要从逻辑上判断,是否是处理问题的解决方法有问题;

    一定要重视程序错误的修改,即可增加自己的经验,也可以提醒自己在写程序时尽可能的避免错误。

    展开全文
  • 程序能一次写完并正常运行的概率很小,基本不超过1%,总会有各种各样的bug...下面我们来看下常用的Python调试方法1. 断点打印法第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看:err.pydef ...

    程序能一次写完并正常运行的概率很小,基本不超过1%,总会有各种各样的bug需要修正。有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug。下面我们来看下常用的Python调试方法

    1. 断点打印法

    第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看:

    err.py

    def foo(s):

    n = int(s)

    print '>>> n = %d' % n

    return 10 / n

    def main():

    foo('0')

    main()

    执行后在输出中查找打印的变量值:

    $ python err.py

    >>> n = 0

    Traceback (most recent call last):

    ...

    ZeroDivisionError: integer division or modulo by zero

    用print最大的坏处是将来还得删掉它,想想程序里到处都是print,运行结果也会包含很多垃圾信息。所以,我们又有第二种方法。

    2. 断言

    凡是用print来辅助查看的地方,都可以用断言(assert)来替代:

    err.py

    def foo(s):

    n = int(s)

    assert n != 0, 'n is zero!'

    return 10 / n

    def main():

    foo('0')

    assert的意思是,表达式n != 0应该是True,否则,后面的代码就会出错。

    如果断言失败,assert语句本身就会抛出AssertionError:

    $ python err.py

    Traceback (most recent call last):

    ...

    AssertionError: n is zero!

    程序中如果到处充斥着assert,和print相比也好不到哪去。不过,启动Python解释器时可以用-O参数来关闭assert:

    $ python -O err.py

    Traceback (most recent call last):

    ...

    ZeroDivisionError: integer division or modulo by zero

    关闭后,你可以把所有的assert语句当成pass来看。

    3. logging日志

    把print替换为logging是第3种方式,和assert比,logging不会抛出错误,而且可以输出到文件:

    err.py

    import logging

    s = '0'

    n = int(s)

    logging.info('n = %d' % n)

    print 10 / n

    logging.info()就可以输出一段文本。运行,发现除了ZeroDivisionError,没有任何信息。怎么回事?

    别急,在import logging之后添加一行配置再试试:

    import logging

    logging.basicConfig(level=logging.INFO)

    看到输出了:

    $ python err.py

    INFO:root:n = 0

    Traceback (most recent call last):

    File "err.py", line 8, in

    print 10 / n

    ZeroDivisionError: integer division or modulo by zero

    这就是logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。

    logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。

    4. pdb调试

    第4种方式是启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。我们先准备好程序:

    err.py

    s = '0'

    n = int(s)

    print 10 / n

    运行:

    $ python -m pdb err.py

    > /Users/PythonTab/Github/sicp/err.py(2)()

    -> s = '0'

    以参数-m pdb启动后,pdb定位到下一步要执行的代码-> s = ‘0’。输入命令l来查看代码:

    (Pdb) l

    1 # err.py

    2 -> s = '0'

    3 n = int(s)

    4 print 10 / n

    [EOF]

    输入命令n可以单步执行代码:

    (Pdb) n

    /Users/PythonTab/Github/sicp/err.py(3)()

    -> n = int(s)

    (Pdb) n

    /Users/PythonTab/Github/sicp/err.py(4)()

    -> print 10 / n

    任何时候都可以输入命令p 变量名来查看变量:

    (Pdb) p s

    '0'

    (Pdb) p n

    0

    输入命令q结束调试,退出程序:

    (Pdb) n

    ZeroDivisionError: 'integer division or modulo by zero'

    > /Users/PythonTab/Github/sicp/err.py(4)()

    -> print 10 / n

    (Pdb) q

    这种通过pdb在命令行调试的方法理论上是万能的,但实在是太麻烦了,如果有一千行代码,要运行到第999行得敲多少命令啊。还好,我们还有另一种调试方法。

    pdb.set_trace()

    这个方法也是用pdb,但是不需要单步执行,我们只需要import pdb,然后,在可能出错的地方放一个pdb.set_trace(),就可以设置一个断点:

    err.py

    import pdb

    s = '0'

    n = int(s)

    pdb.set_trace() # 运行到这里会自动暂停

    print 10 / n

    运行代码,程序会自动在pdb.set_trace()暂停并进入pdb调试环境,可以用命令p查看变量,或者用命令c继续运行:

    $ python err.py

    > /Users/PythonTab/Github/sicp/err.py(7)()

    -> print 10 / n

    (Pdb) p n

    0

    (Pdb) c

    Traceback (most recent call last):

    File "err.py", line 7, in

    print 10 / n

    ZeroDivisionError: integer division or modulo by zero

    这个方式比直接启动pdb单步调试效率要高很多,但也高不到哪去。

    5. IDE调试

    如果要比较爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好的Python IDE有PyCharm,

    另外,Eclipse加上pydev插件也可以调试Python程序。

    小结

    写程序花费的时间往往要小于调试的时间,这个是基本规律。

    虽然用IDE调试起来比较方便,但是最后你会发现,logging才是终极武器。断点调试也是高手的终极利器!

    展开全文
  • 程序能一次写完并正常运行的概率很小,基本不超过1%,总会有各种各样的bug...下面我们来看下常用的Python调试方法1. 断点打印发第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看:www.002pc....

    程序能一次写完并正常运行的概率很小,基本不超过1%,总会有各种各样的bug需要修正。有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug。下面我们来看下常用的Python调试方法

    1. 断点打印发

    第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看:

    www.002pc.com对《python 返回帮助Python常用的程序调试方法》总结来说,为我们python教程很实用。

    err.pydef foo(s):

    n = int(s)

    print '>>> n = %d' % n

    return 10 / n

    def main():

    foo('0')

    main()

    执行后在输出中查找打印的变量值:$ python err.py

    >>> n = 0

    Traceback (most recent call last):

    ...

    ZeroDivisionError: integer division or modulo by zero

    用print最大的坏处是将来还得删掉它,想想程序里到处都是print,运行结果也会包含很多垃圾信息。所以,我们又有第二种方法。

    2. 断言

    凡是用print来辅助查看的地方,都可以用断言(assert)来替代:

    err.pydef foo(s):

    n = int(s)

    assert n != 0, 'n is zero!'

    return 10 / n

    def main():

    foo('0')

    assert的意思是,表达式n != 0应该是True,否则,后面的代码就会出错。

    如果断言失败,assert语句本身就会抛出AssertionError:$ python err.py

    Traceback (most recent call last):

    ...

    AssertionError: n is zero!

    程序中如果到处充斥着assert,和print相比也好不到哪去。不过,启动Python解释器时可以用-O参数来关闭assert:$ python -O err.py

    Traceback (most recent call last):

    ...

    ZeroDivisionError: integer division or modulo by zero

    关闭后,你可以把所有的assert语句当成pass来看。

    3. logging日志

    把print替换为logging是第3种方式,和assert比,logging不会抛出错误,而且可以输出到文件:

    err.pyimport logging

    s = '0'

    n = int(s)

    logging.info('n = %d' % n)

    print 10 / n

    logging.info()就可以输出一段文本。运行,发现除了ZeroDivisionError,没有任何信息。怎么回事?

    别急,在import logging之后添加一行配置再试试:import logging

    logging.basicConfig(level=logging.INFO)

    看到输出了:$ python err.py

    INFO:root:n = 0

    Traceback (most recent call last):

    File "err.py", line 8, in 

    print 10 / n

    ZeroDivisionError: integer division or modulo by zero

    这就是logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。

    logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。

    4. pdb调试

    第4种方式是启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。我们先准备好程序:

    err.pys = '0'

    n = int(s)

    print 10 / n

    运行:$ python -m pdb err.py

    > /Users/PythonTab/Github/sicp/err.py(2)()

    -> s = '0'

    以参数-m pdb启动后,pdb定位到下一步要执行的代码-> s = '0'。输入命令l来查看代码:

    (Pdb) l

    1   # err.py

    2 -> s = '0'

    3   n = int(s)

    4   print 10 / n

    [EOF]

    输入命令n可以单步执行代码:

    (Pdb) n

    > /Users/PythonTab/Github/sicp/err.py(3)()

    -> n = int(s)

    (Pdb) n

    > /Users/PythonTab/Github/sicp/err.py(4)()

    -> print 10 / n

    任何时候都可以输入命令p 变量名来查看变量:

    (Pdb) p s

    '0'

    (Pdb) p n

    0

    输入命令q结束调试,退出程序:

    (Pdb) n

    ZeroDivisionError: 'integer division or modulo by zero'

    > /Users/PythonTab/Github/sicp/err.py(4)()

    -> print 10 / n

    (Pdb) q

    这种通过pdb在命令行调试的方法理论上是万能的,但实在是太麻烦了,如果有一千行代码,要运行到第999行得敲多少命令啊。还好,我们还有另一种调试方法。

    更多:python 返回帮助Python常用的程序调试方法

    https://www.002pc.comhttps://www.002pc.com/python/2446.html

    你可能感兴趣的程序调试,Python,常用,方法

    No alive nodes found in your cluster

    0踩

    0 赞

    展开全文
  • Python常用的程序调试方法

    千次阅读 2017-11-17 16:01:01
    程序能一次写完并正常运行的概率很小,基本不超过1%,总会有各种各样的bug...下面我们来看下常用的Python调试方法1. 断点打印法第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看:err.pydef f

    程序能一次写完并正常运行的概率很小,基本不超过1%,总会有各种各样的bug需要修正。有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug。下面我们来看下常用的Python调试方法


    1. 断点打印法

    第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看:

    err.py

    def foo(s):
        n = int(s)
        print '>>> n = %d' % n
        return 10 / n
    def main():
        foo('0')
    main()

    执行后在输出中查找打印的变量值:

    $ python err.py
    >>> n = 0
    Traceback (most recent call last):
     ...
    ZeroDivisionError: integer division or modulo by zero

    用print最大的坏处是将来还得删掉它,想想程序里到处都是print,运行结果也会包含很多垃圾信息。所以,我们又有第二种方法。


    2. 断言

    凡是用print来辅助查看的地方,都可以用断言(assert)来替代:

    err.py

    def foo(s):
        n = int(s)
        assert n != 0, 'n is zero!'
        return 10 / n
    def main():
        foo('0')

    assert的意思是,表达式n != 0应该是True,否则,后面的代码就会出错。

    如果断言失败,assert语句本身就会抛出AssertionError:

    $ python err.py
    Traceback (most recent call last):
     ...
    AssertionError: n is zero!

    程序中如果到处充斥着assert,和print相比也好不到哪去。不过,启动Python解释器时可以用-O参数来关闭assert:

    $ python -O err.py
    Traceback (most recent call last):
     ...
    ZeroDivisionError: integer division or modulo by zero

    关闭后,你可以把所有的assert语句当成pass来看。


    3. logging日志

    把print替换为logging是第3种方式,和assert比,logging不会抛出错误,而且可以输出到文件:

    err.py

    import logging
    s = '0'
    n = int(s)
    logging.info('n = %d' % n)
    print 10 / n

    logging.info()就可以输出一段文本。运行,发现除了ZeroDivisionError,没有任何信息。怎么回事?

    别急,在import logging之后添加一行配置再试试:

    import logging
    logging.basicConfig(level=logging.INFO)

    看到输出了:

    $ python err.py
    INFO:root:n = 0
    Traceback (most recent call last):
     File "err.py", line 8, in <module>
      print 10 / n
    ZeroDivisionError: integer division or modulo by zero

    这就是logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。

    logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。


    4. pdb调试

    第4种方式是启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。我们先准备好程序:

    err.py

    s = '0'
    n = int(s)
    print 10 / n

    运行:

    $ python -m pdb err.py
    > /Users/PythonTab/Github/sicp/err.py(2)<module>()
    -> s = '0'

    以参数-m pdb启动后,pdb定位到下一步要执行的代码-> s = ‘0’。输入命令l来查看代码:

    (Pdb) l
     1   # err.py
     2 -> s = '0'
     3   n = int(s)
     4   print 10 / n
    [EOF]

    输入命令n可以单步执行代码:

    (Pdb) n
    /Users/PythonTab/Github/sicp/err.py(3)<module>()
    -> n = int(s)
    (Pdb) n
    /Users/PythonTab/Github/sicp/err.py(4)<module>()
    -> print 10 / n

    任何时候都可以输入命令p 变量名来查看变量:

    (Pdb) p s
    '0'
    (Pdb) p n
    0

    输入命令q结束调试,退出程序:

    (Pdb) n
    ZeroDivisionError: 'integer division or modulo by zero'
    > /Users/PythonTab/Github/sicp/err.py(4)<module>()
    -> print 10 / n
    (Pdb) q

    这种通过pdb在命令行调试的方法理论上是万能的,但实在是太麻烦了,如果有一千行代码,要运行到第999行得敲多少命令啊。还好,我们还有另一种调试方法。

    pdb.set_trace()

    这个方法也是用pdb,但是不需要单步执行,我们只需要import pdb,然后,在可能出错的地方放一个pdb.set_trace(),就可以设置一个断点:

    err.py

    import pdb
    s = '0'
    n = int(s)
    pdb.set_trace() # 运行到这里会自动暂停
    print 10 / n

    运行代码,程序会自动在pdb.set_trace()暂停并进入pdb调试环境,可以用命令p查看变量,或者用命令c继续运行:

    $ python err.py 
    > /Users/PythonTab/Github/sicp/err.py(7)<module>()
    -> print 10 / n
    (Pdb) p n
    0
    (Pdb) c
    Traceback (most recent call last):
     File "err.py", line 7, in <module>
      print 10 / n
    ZeroDivisionError: integer division or modulo by zero

    这个方式比直接启动pdb单步调试效率要高很多,但也高不到哪去。

    5. IDE调试

    如果要比较爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好的Python IDE有PyCharm,

    另外,Eclipse加上pydev插件也可以调试Python程序。


    小结

    写程序花费的时间往往要小于调试的时间,这个是基本规律。

    虽然用IDE调试起来比较方便,但是最后你会发现,logging才是终极武器。断点调试也是高手的终极利器!


    本文章为转载,原文章链接:http://www.pythontab.com/html/2017/pythonhexinbiancheng_1115/1182.html?ref=myread
    展开全文
  • Print对于脚本语言,调试最简单方式就是打印输出,而print函数就可以输出各种类型变量,配合着格式化输出,我们可以打印出程序运行过程中各个变量状态值。使用这种方式好处是我们不需要引入其它包,我们只需要...
  • 1、低级错误——编译或链接时提示 编译错误: 变量使用前未定义 函数名拼写错误 括号匹配失败 漏分号 ...(2)执行调试运行,触发程序崩溃,观察指针指向位置,快速找到出错位置 3、高级错误——运行
  • 程序调试的常用方法

    千次阅读 2017-03-30 21:50:34
    常用的程序调试方法有四种: --单步调试(一步一步观察程序是如何运行的,理清逻辑思路) --局部变量(打开局部变量观看其是否被赋值) --打log,在可疑的地方打赏log观看其值是否被打印出来 --内存泄漏(用专门...
  • 驱动程序调试常用方法

    千次阅读 2017-07-09 11:39:11
    本文目的就是介绍驱动开发中常用的几种直接和间接的调试手段,它们是: 利用printk 查看OOP消息 利用strace 利用内核内置的hacking选项 利用ioctl方法 利用/proc 文件系统 使用kgdb 一、利用prin
  • 常用的调试方法

    2020-10-18 20:43:13
    常用的调试方法有如下几种 1. 试探法 调试大员分析错误的润状,猜测问题的所在位置,利用在程序中输出语句,分析寄存器、存储器的内容等手段来获得错误的线索,一步步地试探分析出错误所在。这种方法效率很低,适合...
  • 在Android中,我们会去使用logcat,现在,给大家介绍一种常用的调试方法,debug写文件调试法。在Android系统中,调试一个C应用程序可谓是极其不方便,为了保存log的完整性,于是,写文件调试法可以发挥重大的作用,...
  • linux驱动程序调试常用方法

    千次阅读 2016-06-27 08:03:56
    本文目的就是介绍驱动开发中常用的几种直接和间接的调试手段,它们是: 利用printk查看OOP消息利用strace利用内核内置的hacking选项利用ioctl方法利用/proc 文件系统使用kgdb 一、利用printk 这是驱动开发...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,520
精华内容 1,008
关键字:

常用的程序调试方法