Re: [请益] 埋log debug

楼主: fridayjason (I'm not Beloved)   2016-05-05 22:32:23
※ 引述《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里的内容千万不能影响正常程式执行 例如对变量做运算等
以上 请不吝指教~
作者: CaptainH (Cannon)   2016-05-05 23:34:00
Good
作者: happierway (杰夫)   2016-05-06 03:11:00
推推
作者: roger00 (Stage Column(?))   2016-05-06 19:06:00
挺清楚的
作者: zerofinal (人生~)   2016-05-11 13:08:00
推~

Links booklink

Contact Us: admin [ a t ] ucptt.com