请问你们用脚本语言(Ruby/Python)写程序的时候碰到诡异的问题都怎么调试? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sethverlo
V2EX    问与答

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

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

    有没有对应的工具?
    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
    PRO
       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     Solana     2499 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 15:06 PVG 23:06 LAX 07:06 JFK 10:06
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86