sethverlo
V2EX  ›  问与答

请问你们用脚本语言(Ruby/Python)写程序的时候碰到诡异的问题都怎么调试?

  •  
  •   sethverlo · Aug 20, 2013 · 6320 views
    This topic created in 4830 days ago, the information mentioned may be changed or developed.
    大概就是,想了半天都不知道为什么会出现这样的情况,然后就想看看它每一步都是怎么执行的……

    有没有对应的工具?
    43 replies  •  1970-01-01 08:00:00 +08:00
    lichao
    lichao
    Aug 20, 2013❤️1
    1
    [想看看它每一步都是怎么执行的] ,Ruby 命令行下也可以啊,没 GUI 方便就是了
    typing
    typing
    Aug 20, 2013❤️1
    2
    log

    有时候异步的东西, debugger会不能重现.
    sethverlo
    sethverlo
    OP
    Aug 20, 2013
    3
    @lichao 有时候没有那么简单,比如说发邮件什么的

    @typing log 的话好麻烦…有时候想追踪的比较深的话就要写好多……
    peizh2006
    peizh2006
    Aug 20, 2013❤️1
    4
    REPL+log
    luikore
    luikore
    Aug 20, 2013❤️1
    5
    代码中插一行 binding.pry, 想看什么都可以, 还能 edit-method 直接打开方法的源代码编辑
    yuelang85
    yuelang85
    Aug 20, 2013❤️1
    6
    print
    bluntblade
    bluntblade
    Aug 20, 2013❤️1
    7
    printf + 二分法。
    Livid
    Livid
    MOD
    PRO
    Aug 20, 2013❤️2
    8
    Sentry
    sethverlo
    sethverlo
    OP
    Aug 20, 2013
    9
    @luikore 这几天发现 pry 非常好用,但是请问 .html.erb 这样的呢?
    Mutoo
    Mutoo
    Aug 20, 2013❤️1
    10
    果断TDD吧
    ipconfiger
    ipconfiger
    Aug 20, 2013❤️1
    11
    import logging
    sethverlo
    sethverlo
    OP
    Aug 20, 2013
    12
    @yuelang85
    @bluntblade
    @ipconfiger

    print 或者 logging 也很麻烦,我说的场景是在你觉得这个代码的走向完全超出你的想象,想跟踪一下看看到底每一步走了哪里这样的。。。
    jtacm
    jtacm
    Aug 20, 2013❤️2
    13
    python八荣八耻:

    以动手实践为荣 , 以只看不练为耻;
    以打印日志为荣 , 以单步跟踪为耻;
    以空格缩进为荣 , 以制表缩进为耻;
    以单元测试为荣 , 以人工测试为耻;

    以模块复用为荣 , 以复制粘贴为耻;
    以多态应用为荣 , 以分支判断为耻;
    以Pythonic为荣 , 以冗余拖沓为耻;
    以总结分享为荣 , 以gui求其解为耻;
    davepkxxx
    davepkxxx
    Aug 20, 2013❤️1
    14
    python可以打断点吗?
    sethverlo
    sethverlo
    OP
    Aug 20, 2013
    15
    @jtacm 说是这么说的,但是有的时候一点一点 print 还是很累啊
    shoumu
    shoumu
    Aug 20, 2013❤️1
    16
    我用pycharm可以设置断点,其它的就不知道了
    xunyu
    xunyu
    Aug 20, 2013❤️1
    17
    pdb。。。
    xingzhi
    xingzhi
    Aug 20, 2013
    18
    @Livid Sentry 不是拿来收集信息么,可以实时调试?
    cj1324
    cj1324
    Aug 20, 2013❤️1
    20
    strace /lsof
    9hills
    9hills
    Aug 21, 2013❤️1
    22
    Python完全可以打断点debug,但实话说没啥大用

    print和log是两码事,详细清晰的log不亚于任何debug方法

    还有其他各种debug方法,比如留后门
    luikore
    luikore
    Aug 21, 2013❤️1
    23
    @sethverlo <% binding.pry %>
    luikore
    luikore
    Aug 21, 2013❤️1
    24
    开发环境查虫用 print, 线上产品查虫用 log... 不过 print/log 就能搞定的问题往往都是超简单的.

    疑难问题还是 debug 和 repl 比较有效率, 这些往往都是上下文依赖关系比较强的地方, 看到第一步的结果你才会去想或者试探下一步, 一个交互能力比较强的环境比预设的日志省事多了.

    顺便, 写测试你只多花一倍时间, 没写测试去查问题, 要多花十倍时间...
    thedevil5032
    thedevil5032
    Aug 21, 2013 via iPad❤️1
    25
    以前 log(临时),最近 TDD(一劳永逸)。

    测试的好处在于不仅可以保证现在你的代码正确性,以后的也可以保证。
    sethverlo
    sethverlo
    OP
    Aug 21, 2013
    26
    @9hills
    @luikore

    我的疑问是,使用 logging 的话,一个是需要一点一点自己添加,还有一个就是测试完毕以后要一点一点删除……不知道两位说的「详细清晰的log」还有「线上产品查虫用 log」是个什么情况?
    shierji
    shierji
    Aug 21, 2013❤️1
    27
    其实我想吐糟一下大家有没有注意旁边的推荐书目是百年孤独……
    edgar
    edgar
    Aug 21, 2013❤️1
    28
    @sethverlo 通常log类的库,比如Ruby自带的logger,输出log时都有info,debug等不同的输出级别,然后通过调整输出等级(level)来控制,比如正式上线之后可以只输出info级别的log,所以一般都不需要特别的去删除代码中的输出log部分,同时也可以控制log是输出到标准输出还是文件。有时通过分析log可以看出出错的原因,比如记录在log中的异常、数据库操作没有正常执行等。
    sethverlo
    sethverlo
    OP
    Aug 21, 2013
    29
    @shierji 因为这是问与答。。
    MayLava
    MayLava
    Aug 21, 2013❤️1
    30
    一直是print……
    我也该学学更科学的debug方法了( ̄▽ ̄")
    fanzeyi
    fanzeyi
    Aug 21, 2013❤️1
    31
    import pdb
    pdb.set_trace()

    放在任何想 break 的地方。
    lane128
    lane128
    Aug 21, 2013❤️1
    32
    多用用print 会发现很多有意思的问题
    lycheng
    lycheng
    Aug 21, 2013❤️1
    33
    from IPython import embed; embed()

    之前别人告诉我这个东西,然后弄到代码去之后,就好像断点一样,能直接通过ipython 查看变量信息
    sethverlo
    sethverlo
    OP
    Aug 21, 2013
    34
    @lane128 比如?
    luikore
    luikore
    Aug 21, 2013❤️1
    35
    @sethverlo print 是为了知道运行时发生了什么事情, 没法 print 才用 log, 不知道是否正常才看 log, 这是不得已而为之... 滥用 log 就是连锁反应: 搞 rolling, 压缩, 合并, 日志分析... 本来简单的事情都变得很复杂了.

    map-reduce 查出一个 bug 还不如当初写个测试...
    lixm
    lixm
    Aug 21, 2013❤️1
    36
    log
    qdcanyun
    qdcanyun
    Aug 21, 2013❤️1
    37
    看代码 然后print 找不到log 还不行就pdb....
    sun1991
    sun1991
    Aug 22, 2013 via iPhone❤️1
    38
    推荐一下python tools for visual studio, 集成了强大的debug功能。支持visual studio shell,也就是说完全免费
    davepkxxx
    davepkxxx
    Aug 22, 2013❤️1
    39
    买个pycharm吧,支持debug。
    9hills
    9hills
    Sep 17, 2013❤️1
    40
    @sethverlo
    logging level
    yuelang85
    yuelang85
    Sep 17, 2013❤️1
    41
    @sethverlo 我有一次,程序抛异常,抛出的异常里面含中文,还是个编码错误的中文,于是异常处理代码异常了,所以,我找不到第一个异常的任何信息。

    于是我在相关模块的相关代码里,每行都写了个print。。。。

    一般情况下,如果代码是你写的,或者你非常熟悉这个代码,再诡异的问题都不会难住你。

    如果是非熟悉代码,只要掌握些技巧,比如 @bluntblade 说的二分法,一般也难不到。

    遇到问题了,单元测试(我是说测试代码)很有用,极大提高效率,如果说各种困难(比如需要线上环境)导致无法写单元测试,完全可以自己写些工具搞定。
    guangwong
    guangwong
    Sep 18, 2013❤️1
    42
    扯淡吧,任何語言不打斷點調試,都會蛋疼。
    cxh116
    cxh116
    Sep 18, 2013❤️1
    43
    @guangwong 大部分ruby或python开发者,都是用编辑器吧,大部分编辑器都不能很好的支持debug,所以,一般都是print或log.

    其实动态语言一般都有REPL(console),调试其实有时比编译型的语言还方便.
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1846 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 77ms · UTC 15:47 · PVG 23:47 · LAX 07:47 · JFK 10:47
    ♥ Do have faith in what you're doing.