有关print进行debug的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
slimbloody
V2EX    程序员

有关print进行debug的问题

  •  
  •   slimbloody 2013-12-26 23:22:45 +08:00 5168 次点击
    这是一个创建于 4332 天前的主题,其中的信息可能已经有所发展或是发生改变。
    业界一般使用print进行debug,折腾了一个学期还是不得要领。请各路大神指教,说说自己写代码的时候如何print进行debug的,谢谢!
    21 条回复    1970-01-01 08:00:00 +08:00
    ThomasChan
        1
    ThomasChan  
       2013-12-26 23:32:26 +08:00
    print的目的不就是检查程序运行到哪里停了或者哪一块代码没执行么,这不就是debug?
    。。。
    9hills
        2
    9hills  
       2013-12-26 23:51:47 +08:00 via iPad   1
    一般用log模块,你可以通过搜索 log 最佳实践来找文章看。。。不过最主要的还是实际使用
    RIcter
        3
    RIcter  
       2013-12-27 00:08:46 +08:00
    为何不得要领..我一直觉得只有我这种低端渣渣采用print..
    一般写程序想看看某个值怎么样怎么样直接print出来就可以发现问题了。比如刚才我做一个登陆,死活登陆不进去说密码错误。分析发现错误在某出抛出,为了对比密码和数据库里面的密码直接print,发现原来接收输入的密码忘记了散列...
    Σ(Д)
    firstway
        4
    firstway  
       2013-12-27 01:19:42 +08:00
    debug本质不就是找出实际运行和预期不一样的点么(以及不一样的原因)。
    那么你就在你怀疑的函数后面,或是主要函数前面或后面print一些数据,然后看是否和预期一致,如果不一致,再进一步深入。
    你想想debug工具,如gdb一般怎么用?还不是找主要点,watch或print一些关注的变量什么的
    bombless
        5
    bombless  
       2013-12-27 04:37:15 +08:00
    print搞不定说明你不适合用print。可以试试分析不变量、加断言、断点调试只类的其他手段。
    print真的称不上是所谓一般手段。一般人都是自谦说自己没什么调试技术只好用print
    slimbloody
        6
    slimbloody  
    OP
       2013-12-27 08:26:40 +08:00
    @9hills 谢谢 寒假一定好好实践

    @firstway
    @bombless 大一上的时候一直单步调试来着(渣渣。。。勿喷),https://ismaple.com/blog/2012/06/07/why-you-should-use-editor-and-not-ide/ 在IDE有debugger一节看到觉得说的很好,debugger工具效率低
    pepsin
        7
    pepsin  
       2013-12-27 08:29:53 +08:00
    @RIcter 记得哪里看到个文章,80年代多数著名的程序猿谈到debug手段几乎没有人说print之外的东西了。。。包括了写C的两位还有其它一些大牛。。。

    实际使用的话,我至今没搞明白断点什么的优势在哪,直接打印感觉还是最简单。
    jiych
        8
    jiych  
       2013-12-27 09:27:12 +08:00
    记之前在Z字头国企面试时被问如何调试程序,我说大多数时候用PRINT,感觉立马被藐视了。我错在哪里了?:)
    mengzhuo
        9
    mengzhuo  
       2013-12-27 09:43:36 +08:00
    log比print多了分级,Threadsafe
    *db对print,就是完爆

    print在简单的程序中debug,展示消息确实是好方法,但是在其他环境(比如线上代码)就做死了
    总之,*只有* print/alert来debug的小朋友是Too young too simple啊
    jiych
        10
    jiych  
       2013-12-27 10:06:16 +08:00
    @memgzhao
    I'm simple.真心求教,在实践中应该如何高效调试呢?比如定位内存泄露问题。
    Crossin
        11
    Crossin  
       2013-12-27 10:30:39 +08:00
    我觉得不管是print、log还是断点,本质上就是两个目的:观察变量值的变化、判断程序的执行路径。说到底都是要不断缩小错误范围,直到锁定错误发生的位置。
    dawncold
        12
    dawncold  
       2013-12-27 11:06:17 +08:00
    python的话一般是用:
    import logging
    LOGGER = logging.getLogger(__name__)
    LOGGER.info('xxx: %(name)s', {'name': 'value'})

    我们LOGGER出的东西会被ship到一个日志归集服务器上,再用elasticsearch+kibana做分析.

    另外,pycharm也可以做debug
    loading
        13
    loading  
       2013-12-27 11:11:46 +08:00
    知道在哪放print,以及print什么。
    不过print完要注释或删掉比较麻烦,有时间还是学用log吧!
    humiaozuzu
        14
    humiaozuzu  
       2013-12-27 11:15:46 +08:00
    @dawncold 有 gtalk 吗,可以交流下不,我这里也是做 python full-stack 开发的
    9hills
        15
    9hills  
       2013-12-27 11:17:18 +08:00
    @jiych 如果要debug内存泄露,一般是在系统关键点周期打印当前内存分配情况。

    Python有现成的一些模块
    比如用 http://mg.pov.lt/objgraph/ 来打印内存占用最多的object以及增长最快的object
    还有 http://guppy-pe.sourceforge.net/ 不过这个性能不太好
    dawncold
        16
    dawncold  
       2013-12-27 13:36:49 +08:00
    @humiaozuzu loooseleaves gmail
    mantianyu
        17
    mantianyu  
       2013-12-27 22:47:57 +08:00   2
    我一开始, 也觉得 print 是最"低端"的调试手段, 我觉得大牛们肯定都使用我们不知道的高级手法调试, 比如 strace 之类.

    不过后来不那么认为了, 我后来随着阅读量的增加, 看过的程序设计书和程序设计的文章里(都是国外的)里介绍调试方法的时候, 几乎都会说道 print 是简单又实用的方式. 我渐渐的也知道了其实大牛们使用频率最多的也是 print...所以没什么低端的.

    关键是, print 的时候, 要 print 出有用的信息, 比如说要能让你清楚的看到你的程序的运行流程, 那个条件过了, 那个条件没过.

    而且个人觉得, print 出的信息一定要充足, 而且一定要有整齐的格式, 缩进, 换行, 分割线, 文件名, 行号, 该加的都加上, 这对你的调试工作有相当大的帮助!
    mantianyu
        18
    mantianyu  
       2013-12-27 22:52:59 +08:00
    @mengzhuo

    我们一般都是这种写法:

    #define DEBUG 1

    #ifdef DEBUG
    #define print_trace(...) printf(__VA_ARGS__)
    #else
    #define print_trace(...)
    #endif

    生产环境上把 DEBUG 改成 0 就行了
    mengzhuo
        19
    mengzhuo  
       2013-12-27 23:42:45 +08:00
    @jiych = =|| 我现在只会python/js/gjs这些,内存泄漏是啥?

    p.s.我也没有说print不好,只是这些调试方法都需要合适的场景才能发挥他们的潜能。

    @mantianyu 哈哈哈,我们python项目里也基本上是分别设定logging等级来实现的。strace让我想起了和我们技术总监一起逆向分析php木马的那段日子……不堪回首啊……
    Moods
        20
    Moods  
       2013-12-28 15:24:13 +08:00
    log多了确实也会比较乱…
    znx5858
        21
    znx5858  
       2013-12-28 19:44:11 +08:00
    print一般用单线程,控制台调试.多个线程,还是日志吧.
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2854 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 14:02 PVG 22:02 LAX 06:02 JFK 09:02
    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