V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
keepwalk2020
V2EX  ›  Python

想知道现在还有多少人用 print 调试 debug?

  •  1
     
  •   keepwalk2020 · 2020-11-15 21:06:48 +08:00 · 13971 次点击
    这是一个创建于 1470 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在 IDE 功能日益强大的今天,还有多少人在用 print 调试程序?
    118 条回复    2020-11-24 12:01:50 +08:00
    1  2  
    loadingimg
        1
    loadingimg  
       2020-11-15 21:43:07 +08:00
    anjianshi
        2
    anjianshi  
       2020-11-15 22:07:43 +08:00
    loading
        3
    loading  
       2020-11-15 22:30:35 +08:00 via Android   ❤️ 25

    后端 print
    前端 console.log
    hendyzone
        4
    hendyzone  
       2020-11-15 22:31:11 +08:00
    zqx
        5
    zqx  
       2020-11-15 22:40:05 +08:00 via Android
    新手喜欢用 log,运行完了看输出。
    高手单步调试
    levelworm
        6
    levelworm  
       2020-11-15 22:51:50 +08:00 via Android
    一开始 print,解决不了的单步。
    Jirajine
        7
    Jirajine  
       2020-11-15 22:58:20 +08:00 via Android
    解释型语言的调试器都可以 eval 任意表达式,编译型语言很多就不行,那就还是需要 print 。
    ConradG
        8
    ConradG  
       2020-11-15 23:05:45 +08:00

    IDE 再强大,也没法在测试环境用
    ciaoly
        9
    ciaoly  
       2020-11-15 23:12:17 +08:00 via Android
    打日志找 bug 不是很正常吗?🧐
    laminux29
        10
    laminux29  
       2020-11-15 23:19:17 +08:00
    开发环境、临时测试环境、正式环境,这三种环境,测试使用的工具与方法,肯定会有不同。

    但无论如何,用 print 之类的来 debug,是有点不专业。
    opensail
        11
    opensail  
       2020-11-15 23:23:09 +08:00 via Android
    用啊,fprintf,qdebug()啥的
    unixeno
        12
    unixeno  
       2020-11-15 23:34:32 +08:00 via Android
    生产环境你也打不上断点
    微服务下,一个请求调 100 个服务的那种,不靠 print 你也没法调
    jdhao
        13
    jdhao  
       2020-11-15 23:38:46 +08:00 via Android   ❤️ 1
    高手用几个 print 大概就能找到问题所在,然后尽力复现就行了。。。
    heiheidewo
        14
    heiheidewo  
       2020-11-15 23:42:20 +08:00   ❤️ 1
    多线程时你去单步试下?
    salife
        15
    salife  
       2020-11-15 23:44:50 +08:00
    用 log 替换 print 吧,编程规范里面不知道有没有准用 print
    lkhao1231
        16
    lkhao1231  
       2020-11-16 00:50:42 +08:00
    dev 直接 remote debug
    非 dev 的测试环境 查 log
    wty
        17
    wty  
       2020-11-16 01:00:43 +08:00 via Android
    最近搞 nrf52832,协议栈不允许暂停,敢打断点程序就直接崩给你看,,,,快搞吐了。
    anguiao
        18
    anguiao  
       2020-11-16 01:04:20 +08:00 via Android
    @salife 编程规范也只能管提交上去的代码,自己本地怎么调试,还真管不着。
    est
        19
    est  
       2020-11-16 01:31:04 +08:00 via Android   ❤️ 50
    IDE 就能重现的 bug 也好意思叫 bug ?
    DoctorCat
        20
    DoctorCat  
       2020-11-16 01:57:51 +08:00   ❤️ 5
    print 一堆 fuck,分分钟迅速解决掉问题
    binux
        21
    binux  
       2020-11-16 04:13:30 +08:00 via Android
    @zqx 真正的高手都用 print,因为他们知道在哪打 log
    msg7086
        22
    msg7086  
       2020-11-16 04:14:50 +08:00
    生产环境上没办法单步 debug,除了打 log 没别的办法。
    本机一般用不上单步,打打 log,甚至有时候写个 test case 就能调通了。
    yh6788
        23
    yh6788  
       2020-11-16 05:25:40 +08:00
    我,很灵活啊。
    ysmood
        24
    ysmood  
       2020-11-16 06:01:30 +08:00 via Android   ❤️ 2
    成长阶段一般都是 print 到 break point 再到 print,不过高阶的 print 已经和最开始时的很不一样了。比如某个断点一次运行会被调用几百次且难以写条件断点时 log 很可能是更效率的 debug 方式,再比联调分布式布式系统也难以用断点, 典型的项目可以看 open tracing 。

    我个人感觉只有调试非常简单的东西断点才会用断点。栈深点的算法用断点对普通人来说心智负担都很大,可能都会用动画级别的 log 来辅助大脑理解了。
    Mutoo
        25
    Mutoo  
       2020-11-16 06:25:10 +08:00
    现在前端调试器除了有 breakpoing 还有 conditional breakpoint 和 logpoint,后者是 print+breakpoint 的杂交。还可以直接在代码里加 debugger; 进行断点。
    raaaaaar
        26
    raaaaaar  
       2020-11-16 07:15:42 +08:00 via Android
    都部署到环境上去后,楼上是怎么 print 的? log 设计好,不比 print 好多了
    waruqi
        27
    waruqi  
       2020-11-16 07:39:45 +08:00 via Android
    一直都是 print,已经快 10 年没用 ide 调过了
    Mithril
        28
    Mithril  
       2020-11-16 07:48:11 +08:00
    条件断点有多卡你试过么。。。分分钟给你把 bug 卡没了。。。。
    多线程来回跑的时候全靠 print 多条关键路径来还原场景,这种情况下要么 print,要么写好 if 再往里面写点垃圾代码打断点,本质上还是 print
    yjxjn
        29
    yjxjn  
       2020-11-16 08:01:42 +08:00
    @salife 肯定不能用啊,sonarlint 以及 spotbugs 写了 print 都要警告的。
    Nich0la5
        30
    Nich0la5  
       2020-11-16 08:05:41 +08:00 via Android
    这么多人用 print ?按规范不应该用 logger 吗
    Mithril
        31
    Mithril  
       2020-11-16 08:12:01 +08:00
    @yjxjn 用来 debug 的代码又不会提交上去,跟 lint 有啥关系。
    @Nich0la5 debug 用的,又不是在产品上挂 print 。而且有的 logger 会有缓存,多线程情况下并不一定能保证输出的 log 顺序是正确的。
    Nich0la5
        32
    Nich0la5  
       2020-11-16 08:20:10 +08:00 via Android
    @Mithril 使用 logger 可以把线程信息写进去,一次封装好后面就不愁了,debug 完把日志级别一改就完事。
    而且大型项目都有统一的 logger 定向位置,用 print 是拿不到日志的
    IgniteWhite
        33
    IgniteWhite  
       2020-11-16 08:20:45 +08:00
    我……主要是菜
    Mithril
        34
    Mithril  
       2020-11-16 08:34:12 +08:00
    @Nich0la5 说的不是同一个事。debug 用的 log 肯定是有的,我们说的是你在发现 bug 以后,本机调试过程中使用 print 而不是 IDE 本身的 debuger 。
    而且当你想要看到多个线程的代码在某一段时间的执行是如何互相影响时,光是记录线程 ID 是没什么用的。你还要保证这些线程的 logger 共用缓冲,然后 logger 没准就在里面加了个锁,到时候你的线程状态和出 bug 的时候就不一样了。
    当然你可以靠时间去排个序,不过这么折腾为啥不直接加个 print ?
    Hconk
        35
    Hconk  
       2020-11-16 09:02:54 +08:00 via iPhone
    一般来讲能用 IDE 调试的 bug 就尽量用 IDE 的 breakpoint, condition breakpoint, 包括尽可能用 vsc 的 remote ssh 调试, 但是在分布式集群上的程序 bug,没办法直接上 IDE 去调试,最后还是先 log 一些日志,如果能定位到问题就直接解决,如果遇到比较麻烦的 bug 还是会想办法在 IDE 下复现调试。
    MOETAN0
        36
    MOETAN0  
       2020-11-16 09:12:22 +08:00
    我,在循环中观察变化,print/日志是最顺手的
    RickyC
        37
    RickyC  
       2020-11-16 09:12:34 +08:00
    php 用 print_r()
    phpxiaowangzi
        38
    phpxiaowangzi  
       2020-11-16 09:13:33 +08:00
    前端 console.log 后端 var_dump
    bear2000
        39
    bear2000  
       2020-11-16 09:27:33 +08:00
    没有断点调试的情况下就用 print
    radiocontroller
        40
    radiocontroller  
       2020-11-16 09:30:06 +08:00
    没有人比我更懂 print !
    edk24
        41
    edk24  
       2020-11-16 09:30:13 +08:00
    后端 trace(),js 偶尔 trace
    annielong
        42
    annielong  
       2020-11-16 09:33:43 +08:00
    log 有时候记录太多了,不好查,还是 print 简单明了
    weyou
        43
    weyou  
       2020-11-16 09:34:00 +08:00 via Android
    同样经历 print->断点调试->print 的阶段,前两个阶段在学校完成的,工作以后就没再用过断点调试。另外 log 和 print,对于我来说这两者没有本质区别,没啥好争论的。
    Molita
        44
    Molita  
       2020-11-16 09:36:05 +08:00
    用 python 话 用 pdb trace,挺好用的
    czdpzc
        45
    czdpzc  
       2020-11-16 09:41:28 +08:00
    dcty
        46
    dcty  
       2020-11-16 09:44:42 +08:00
    有时候一断点,bug 它就不出现了。
    onice
        47
    onice  
       2020-11-16 09:48:22 +08:00
    我就是啊。
    wlfeng
        48
    wlfeng  
       2020-11-16 09:48:50 +08:00
    一般本地开发用 debug,部署到服务器上就看 log,所以写代码的时候怎么打 log 也是很讲究的
    S0on
        49
    S0on  
       2020-11-16 09:50:43 +08:00
    northisland
        50
    northisland  
       2020-11-16 09:53:36 +08:00
    不得已情况下,会这么干。。。

    经常是接手一块老功能,大概是 java 或 python 调 c++的动态库。。。

    写个类似的测试用例(输入正反序列化一下)的时间,可能改动都实现 8 回了。


    但是有条件还是 ide 香。
    Winrey
        51
    Winrey  
       2020-11-16 09:55:51 +08:00
    我我我! [举手

    可以试试 Sentry 其实
    northisland
        52
    northisland  
       2020-11-16 09:56:35 +08:00
    都是实现需求,print + LOG 硬莽,还是 ide 见招拆招,都差不多。
    sidegem
        53
    sidegem  
       2020-11-16 09:57:36 +08:00
    比起 ide 的调试功能,我觉得 print 更好用点
    hikkikuma1991
        54
    hikkikuma1991  
       2020-11-16 10:06:09 +08:00
    我。。。我都是写分布式程序的,几千台机器上调试除了看 log 没有别的好办法= =
    newmlp
        55
    newmlp  
       2020-11-16 10:09:47 +08:00
    @Nich0la5 不都是一回事么
    Lawskiy
        56
    Lawskiy  
       2020-11-16 10:10:55 +08:00
    debug ros node ? 我觉得还是 print 简单点🤦‍
    clf
        57
    clf  
       2020-11-16 10:12:40 +08:00
    怎么方便怎么来。
    itskingname
        58
    itskingname  
       2020-11-16 10:29:45 +08:00
    给你讲,我老师,在 macOS 上面安装 Windows,然后在 Windows 里面跑 Visual Studio 运行 VB,他调试的时候,用 dialogbox,用报警对话框来显示变量的值。比 print 可牛逼多了。[狗头]
    xloger
        59
    xloger  
       2020-11-16 10:40:53 +08:00
    我我我,Android 开发,用 Debug 跑一次增量大概第一次三四分钟,之后一分钟吧,直接运行十秒不到,换你你选哪个...
    Deepseafish
        60
    Deepseafish  
       2020-11-16 10:48:33 +08:00   ❤️ 4
    是时候祭出这张图了
    Rekkles
        61
    Rekkles  
       2020-11-16 10:49:41 +08:00
    连 debug 都能区分优越感
    wangyzj
        62
    wangyzj  
       2020-11-16 10:53:16 +08:00
    我!
    redtea
        63
    redtea  
       2020-11-16 11:07:59 +08:00
    java 用 print 有性能问题,不知道 python 有没有。
    THESDZ
        64
    THESDZ  
       2020-11-16 11:08:51 +08:00
    手段而已
    aneostart173
        65
    aneostart173  
       2020-11-16 11:09:05 +08:00
    print 调试不可替代。
    faceRollingKB
        66
    faceRollingKB  
       2020-11-16 11:11:07 +08:00
    不如调查一下,有多少人完全不用 print 或者 console.log ,不知道一只手能不能数的过来
    est
        68
    est  
       2020-11-16 11:20:54 +08:00
    好像贴错了。反正记得有个问题是 python 的 print 带了 buffer,java 的没带。然后每次调用就很浪费。
    nuk
        69
    nuk  
       2020-11-16 11:27:35 +08:00
    一般在 gdb 里 print,加 print 重新编译要太久太久,而且太多比较难复现。
    比如。。在很偶然的情况下。。我们自己实现的 map 的 hash 值居然会算错。
    vipppppp
        70
    vipppppp  
       2020-11-16 11:28:33 +08:00   ❤️ 1
    代码有很多异步或者回调的时候,打断点也不一定比 print 来的有效
    goodboy95
        71
    goodboy95  
       2020-11-16 11:31:34 +08:00
    单步调试用起来爽,但正式环境下还是要 print,不要问为什么不搞远程调试,问就是正式服要求高安全性。
    reus
        72
    reus  
       2020-11-16 11:42:26 +08:00 via Android
    所有涉及超时的程序都不能打断点,只能靠打印信息,这是本质问题,工具再强大,也改变不了客观规律
    yolee599
        73
    yolee599  
       2020-11-16 11:45:43 +08:00
    用自己写的 log 工具,可以自定义 level,可以用一句宏定义关闭
    crclz
        74
    crclz  
       2020-11-16 12:21:34 +08:00
    我觉得两种都得会。
    crclz
        75
    crclz  
       2020-11-16 12:23:51 +08:00
    Don't underestimate the value of printf().
    ---- stanford cs140 课程

    http://web.stanford.edu/~ouster/cgi-bin/cs140-spring20/pintos/pintos_10.html
    darknoll
        76
    darknoll  
       2020-11-16 12:39:03 +08:00   ❤️ 1
    @zqx 说反了
    iFollow
        77
    iFollow  
       2020-11-16 13:20:52 +08:00 via Android
    本人调驱动只会 printk ……
    paoqi2048
        78
    paoqi2048  
       2020-11-16 13:30:23 +08:00
    我用 print 还有 log
    dbow
        79
    dbow  
       2020-11-16 13:34:48 +08:00
    现在遇到的 bug, 都很奇特, 时有时无, 复现困难, 只能用 print
    killeder
        80
    killeder  
       2020-11-16 13:41:54 +08:00
    嵌入式,printf 是最常用的调试手段
    DoUSeeMe
        81
    DoUSeeMe  
       2020-11-16 13:48:25 +08:00
    🙋‍
    across
        82
    across  
       2020-11-16 13:50:28 +08:00
    看到这种问题,我只觉得论坛平均技术水平断崖式下跌····

    你能想象电子行业的人出来问:还在人拿锤子修理机械么?
    Felldeadbird
        83
    Felldeadbird  
       2020-11-16 13:52:37 +08:00
    一直用 print 啊。虽然知道有更好的工具。但是习惯了,很难改。

    其次,生产环境我一样 print 。 不过我会上一些参数来调试。不影响正常业务运作。
    iSecret
        84
    iSecret  
       2020-11-16 13:53:07 +08:00   ❤️ 1
    不,我写的程序没有 BUG 。(狗
    cholerae
        85
    cholerae  
       2020-11-16 13:53:55 +08:00
    内核和驱动调试不用 printk 怎么整,很麻烦的
    walsh
        86
    walsh  
       2020-11-16 14:19:28 +08:00
    高手都是徒手看 dump(狗头)
    shpkng
        87
    shpkng  
       2020-11-16 14:22:51 +08:00
    acmore
        88
    acmore  
       2020-11-16 14:26:12 +08:00
    Print 和 Debugger 都是工具和手段,怎么快怎么来,通过二分迭代 + Print 就能迅速定位的还要走单步调试就略显迂腐了,一般在 Context 比较庞大的情况下用 Debugger 效果才会更加显著。
    sr0miao
        89
    sr0miao  
       2020-11-16 14:46:45 +08:00
    me
    lzyliangzheyu
        90
    lzyliangzheyu  
       2020-11-16 15:13:39 +08:00
    上仿真器(逃
    sockpuppet9527
        91
    sockpuppet9527  
       2020-11-16 15:38:08 +08:00
    我,除非没有 printf/dump 只能用 gdb :)
    SomeoneElseChild
        92
    SomeoneElseChild  
       2020-11-16 15:40:01 +08:00
    单纯不想按 F9
    paloalto
        93
    paloalto  
       2020-11-16 15:45:27 +08:00   ❤️ 3
    昨天,有俩个年轻同事来找我,说:马老师,线上网页打不开,发生甚末事了?
    我一看!哦,原来是线上环境有 bug 。
    传统 debug 讲究的是接化发,我“啪”就发出一串 print,很快啊!我全部防出去,防出去了啊。防出去以后,自然是,传统 debug,点到为止。
    这个 bug 不讲码德,来,骗,来,偷袭,我 30 多岁的,老码农。这好吗?这不好!
    我劝,这个 bug,耗子尾汁,好好反思。以后不要再犯这样的聪明,小聪明。
    编程开发,要以和为贵,要讲码德,不要搞,窝里斗。谢谢朋友们!
    lhx6538665
        94
    lhx6538665  
       2020-11-16 15:45:32 +08:00
    递归 循环 这种断点已经很难用了
    鼠标移动事件 断点根本不能用
    一切需要精确时间的操作,使用断点就是错误的做法
    sampeng
        95
    sampeng  
       2020-11-16 15:48:34 +08:00
    只有无奈的情况才单点。。。print 是最好的调试方式。。。。你单点调试一轮,我已经解三 bug 了
    Macv1994
        96
    Macv1994  
       2020-11-16 15:49:42 +08:00
    前端 console.log()
    后端 print
    手动滑稽
    richzhu
        97
    richzhu  
       2020-11-16 15:58:42 +08:00
    VeryCB
        98
    VeryCB  
       2020-11-16 16:01:09 +08:00
    tu9oh0st
        99
    tu9oh0st  
       2020-11-16 16:01:44 +08:00
    ezleeinfo
        100
    ezleeinfo  
       2020-11-16 16:23:46 +08:00
    你提这个问题有没有想过,用什么是解决什么问题的吗?解决问题就行了,没必要把程序员似的优越感弄出来。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2959 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 14:16 · PVG 22:16 · LAX 06:16 · JFK 09:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.