1
ThomasChan 2013-12-26 23:32:26 +08:00
print的目的不就是检查程序运行到哪里停了或者哪一块代码没执行么,这不就是debug?
。。。 |
2
9hills 2013-12-26 23:51:47 +08:00 via iPad 1
一般用log模块,你可以通过搜索 log 最佳实践来找文章看。。。不过最主要的还是实际使用
|
3
RIcter 2013-12-27 00:08:46 +08:00
为何不得要领..我一直觉得只有我这种低端渣渣采用print..
一般写程序想看看某个值怎么样怎么样直接print出来就可以发现问题了。比如刚才我做一个登陆,死活登陆不进去说密码错误。分析发现错误在某出抛出,为了对比密码和数据库里面的密码直接print,发现原来接收输入的密码忘记了散列... Σ(゚Д゚) |
4
firstway 2013-12-27 01:19:42 +08:00
debug本质不就是找出实际运行和预期不一样的点么(以及不一样的原因)。
那么你就在你怀疑的函数后面,或是主要函数前面或后面print一些数据,然后看是否和预期一致,如果不一致,再进一步深入。 你想想debug工具,如gdb一般怎么用?还不是找主要点,watch或print一些关注的变量什么的 |
5
bombless 2013-12-27 04:37:15 +08:00
print搞不定说明你不适合用print。可以试试分析不变量、加断言、断点调试只类的其他手段。
print真的称不上是所谓一般手段。一般人都是自谦说自己没什么调试技术只好用print |
6
slimbloody OP @9hills 谢谢 寒假一定好好实践
@firstway @bombless 大一上的时候一直单步调试来着(渣渣。。。勿喷),https://ismaple.com/blog/2012/06/07/why-you-should-use-editor-and-not-ide/ 在IDE有debugger一节看到觉得说的很好,debugger工具效率低 |
7
pepsin 2013-12-27 08:29:53 +08:00
@RIcter 记得哪里看到个文章,80年代多数著名的程序猿谈到debug手段几乎没有人说print之外的东西了。。。包括了写C的两位还有其它一些大牛。。。
实际使用的话,我至今没搞明白断点什么的优势在哪,直接打印感觉还是最简单。 |
8
jiych 2013-12-27 09:27:12 +08:00
记嘚之前在Z字头国企面试时被问如何调试程序,我说大多数时候用PRINT,感觉立马被藐视了。我错在哪里了?:)
|
9
mengzhuo 2013-12-27 09:43:36 +08:00
log比print多了分级,Threadsafe
*db对print,就是完爆 print在简单的程序中debug,展示消息确实是好方法,但是在其他环境(比如线上代码)就做死了 总之,*只有* print/alert来debug的小朋友是Too young too simple啊 |
11
Crossin 2013-12-27 10:30:39 +08:00
我觉得不管是print、log还是断点,本质上就是两个目的:观察变量值的变化、判断程序的执行路径。说到底都是要不断缩小错误范围,直到锁定错误发生的位置。
|
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 |
13
loading 2013-12-27 11:11:46 +08:00
知道在哪放print,以及print什么。
不过print完要注释或删掉比较麻烦,有时间还是学用log吧! |
14
humiaozuzu 2013-12-27 11:15:46 +08:00
@dawncold 有 gtalk 吗,可以交流下不,我这里也是做 python full-stack 开发的
|
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/ 不过这个性能不太好 |
16
dawncold 2013-12-27 13:36:49 +08:00
@humiaozuzu loooseleaves gmail
|
17
mantianyu 2013-12-27 22:47:57 +08:00 2
我一开始, 也觉得 print 是最"低端"的调试手段, 我觉得大牛们肯定都使用我们不知道的高级手法调试, 比如 strace 之类.
不过后来不那么认为了, 我后来随着阅读量的增加, 看过的程序设计书和程序设计的文章里(都是国外的)里介绍调试方法的时候, 几乎都会说道 print 是简单又实用的方式. 我渐渐的也知道了其实大牛们使用频率最多的也是 print...所以没什么低端的. 关键是, print 的时候, 要 print 出有用的信息, 比如说要能让你清楚的看到你的程序的运行流程, 那个条件过了, 那个条件没过. 而且个人觉得, print 出的信息一定要充足, 而且一定要有整齐的格式, 缩进, 换行, 分割线, 文件名, 行号, 该加的都加上, 这对你的调试工作有相当大的帮助! |
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 就行了 |
19
mengzhuo 2013-12-27 23:42:45 +08:00
|
20
Moods 2013-12-28 15:24:13 +08:00
log多了确实也会比较乱…
|
21
znx5858 2013-12-28 19:44:11 +08:00
print一般用单线程,控制台调试.多个线程,还是日志吧.
|