作者fridayjason (I'm not Beloved)
看板Soft_Job
标题Re: [请益] 埋log debug
时间Thu May 5 22:32:23 2016
※ 引述《yshihyu (yshihyu)》之铭言:
: 我最近在 debug 把主要函数关键地方埋log, bug 有好几个
: 发现有个有问题假设称为 A bug 埋log找原因,
: 後来感觉函数关键log 跟 debug log 太多, 越来越乱很难分析
: 如果先mark掉函数关键地方的log 但是log很多地方感觉很麻烦,
: 解掉问题又在umark在继续找 B bug之类的,
: 後来我作法是用gdb 只埋函数关键 log , 发现问题就用gdb 去看
: 但使用gdb 有时候没办法 log 可以分析整体 ,
: 因为有时候 log 不断迭代几次後才能看出前後数据找出问题点
: 大家用埋 log 有什麽技巧或是特殊工具方法嘛?
: 谢谢
分享一下个人经验抛砖引玉
套件: 其实不用自己重写 开源套件很多 看平台跟语言搜寻一下 如log4net log4cpp等
功能: log module本身要稳且不能影响正常功能 例如不能吃太多记忆体 IO频宽 运算效能
尤其注意multi-thread时的IO和queue 若time-stamp不准至少相对顺序要是正确的
要自己实作的话可以用 singleton pattern + producer-consumer pattern
输出的部分建议要能支援直接显示或者写到档案 这样正式发行後方便跟客户要纪录
分层: 一般套件都会分几个层次 建议自己有个准则方便筛选 以Android logcat而例:
Assert: 违反规格假设 例如不该是null的物件 或者数值超出假设范围的情况等
Error: 内外系统错误 例如封包错误 资料库错误 记忆体错误 底层套件崩溃等
Warning:逻辑流程警示 例如操作逾时 找不到档案 输入无效 连线中断等
Info: 重要过程指标 例如检查码验算值 资料总数 执行结果 判断分歧点等
Debug: 巨观函数除错 例如"func(input1, input2) @ status = result"
Verbose:底层函数除错 例如"func.step3 @ (var1, var2) = temp"
正式发行时应该只要开到Info层就够了 再往下主要是开发时除错在用
release build时可用define等方法把低层级的log关掉以提升效能
因此要注意写在log里的内容千万不能影响正常程式执行 例如对变数做运算等
以上 请不吝指教~
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.240.223.54
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Soft_Job/M.1462458747.A.D9E.html
1F:推 CaptainH: Good 05/05 23:34
2F:推 happierway: 推推 05/06 03:11
3F:推 roger00: 挺清楚的 05/06 19:06
4F:推 zerofinal: 推~ 05/11 13:08