V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sethverlo
V2EX  ›  问与答

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

  •  
  •   sethverlo · 2013-08-20 17:33:38 +08:00 · 4886 次点击
    这是一个创建于 3912 天前的主题,其中的信息可能已经有所发展或是发生改变。
    大概就是,想了半天都不知道为什么会出现这样的情况,然后就想看看它每一步都是怎么执行的……

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

    有时候异步的东西, debugger会不能重现.
    sethverlo
        3
    sethverlo  
    OP
       2013-08-20 17:45:02 +08:00
    @lichao 有时候没有那么简单,比如说发邮件什么的

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

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

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

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

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

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

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

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

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

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

    放在任何想 break 的地方。
    lane128
        32
    lane128  
       2013-08-21 11:54:23 +08:00   ❤️ 1
    多用用print 会发现很多有意思的问题
    lycheng
        33
    lycheng  
       2013-08-21 12:00:38 +08:00   ❤️ 1
    from IPython import embed; embed()

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

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

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

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

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

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

    其实动态语言一般都有REPL(console),调试其实有时比编译型的语言还方便.
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1217 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 17:55 · PVG 01:55 · LAX 10:55 · JFK 13:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.