V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
slimbloody
V2EX  ›  程序员

有关print进行debug的问题

  •  
  •   slimbloody · 2013-12-26 23:22:45 +08:00 · 4626 次点击
    这是一个创建于 3994 天前的主题,其中的信息可能已经有所发展或是发生改变。
    业界一般使用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   ·   实用小工具   ·   980 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 21:40 · PVG 05:40 · LAX 13:40 · JFK 16:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.