有关print进行debug的问题

2013-12-26 23:22:45 +08:00
 slimbloody
业界一般使用print进行debug,折腾了一个学期还是不得要领。请各路大神指教,说说自己写代码的时候如何print进行debug的,谢谢!
4615 次点击
所在节点    程序员
21 条回复
ThomasChan
2013-12-26 23:32:26 +08:00
print的目的不就是检查程序运行到哪里停了或者哪一块代码没执行么,这不就是debug?
。。。
9hills
2013-12-26 23:51:47 +08:00
一般用log模块,你可以通过搜索 log 最佳实践来找文章看。。。不过最主要的还是实际使用
RIcter
2013-12-27 00:08:46 +08:00
为何不得要领..我一直觉得只有我这种低端渣渣采用print..
一般写程序想看看某个值怎么样怎么样直接print出来就可以发现问题了。比如刚才我做一个登陆,死活登陆不进去说密码错误。分析发现错误在某出抛出,为了对比密码和数据库里面的密码直接print,发现原来接收输入的密码忘记了散列...
Σ(゚Д゚)
firstway
2013-12-27 01:19:42 +08:00
debug本质不就是找出实际运行和预期不一样的点么(以及不一样的原因)。
那么你就在你怀疑的函数后面,或是主要函数前面或后面print一些数据,然后看是否和预期一致,如果不一致,再进一步深入。
你想想debug工具,如gdb一般怎么用?还不是找主要点,watch或print一些关注的变量什么的
bombless
2013-12-27 04:37:15 +08:00
print搞不定说明你不适合用print。可以试试分析不变量、加断言、断点调试只类的其他手段。
print真的称不上是所谓一般手段。一般人都是自谦说自己没什么调试技术只好用print
slimbloody
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
2013-12-27 08:29:53 +08:00
@RIcter 记得哪里看到个文章,80年代多数著名的程序猿谈到debug手段几乎没有人说print之外的东西了。。。包括了写C的两位还有其它一些大牛。。。

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

print在简单的程序中debug,展示消息确实是好方法,但是在其他环境(比如线上代码)就做死了
总之,*只有* print/alert来debug的小朋友是Too young too simple啊
jiych
2013-12-27 10:06:16 +08:00
@memgzhao
I'm simple.真心求教,在实践中应该如何高效调试呢?比如定位内存泄露问题。
Crossin
2013-12-27 10:30:39 +08:00
我觉得不管是print、log还是断点,本质上就是两个目的:观察变量值的变化、判断程序的执行路径。说到底都是要不断缩小错误范围,直到锁定错误发生的位置。
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
2013-12-27 11:11:46 +08:00
知道在哪放print,以及print什么。
不过print完要注释或删掉比较麻烦,有时间还是学用log吧!
humiaozuzu
2013-12-27 11:15:46 +08:00
@dawncold 有 gtalk 吗,可以交流下不,我这里也是做 python full-stack 开发的
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
2013-12-27 13:36:49 +08:00
@humiaozuzu loooseleaves gmail
mantianyu
2013-12-27 22:47:57 +08:00
我一开始, 也觉得 print 是最"低端"的调试手段, 我觉得大牛们肯定都使用我们不知道的高级手法调试, 比如 strace 之类.

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

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

而且个人觉得, print 出的信息一定要充足, 而且一定要有整齐的格式, 缩进, 换行, 分割线, 文件名, 行号, 该加的都加上, 这对你的调试工作有相当大的帮助!
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
2013-12-27 23:42:45 +08:00
@jiych = =|| 我现在只会python/js/gjs这些,内存泄漏是啥?

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

@mantianyu 哈哈哈,我们python项目里也基本上是分别设定logging等级来实现的。strace让我想起了和我们技术总监一起逆向分析php木马的那段日子……不堪回首啊……
Moods
2013-12-28 15:24:13 +08:00
log多了确实也会比较乱…

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/94704

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX