拿到一个新 bug 怎样分析

1. 拿到一个新 bug, 首先要重现问题. 这对 code 问题是必须的, 对客户的 data 问题, 几乎也是必须的. 如果是 code 问题, 不重现就没办法修改代码, 改好了也无法验证是不是改对了. 客户的 data 出问题, 多数情况也是能够重现的. 毕竟客户是用我们的系统操作的, 只要拿到客户的历史数据, 对照着是可以自己做出同样的数据. 以前我遇到 data fix 的时候不喜欢重现, 都是凭感觉给出脚本. 但这样常常忽略一些重要的数据, 容易出错. 如果确定是 data fix,
我们就默认 code 是没有问题的, 给出的脚本就应该和在系统上正确操作得到的结果保持一致.

2. 重现了 bug, 熟悉了整个流程, 就知道问题出在哪儿, 正确的行为应该是怎样的. 这时不是急急忙忙的去分析, 而是去查找. 找什么呢? 就是找以前的人是不是遇到过同样的问题. 查找主要是在 Bug 系统里面, 和 Support 网站上. Bug 系统里面有所有 bug 的历史数据, 根据关键词可以找到类似甚至相同的 bug. 可以看看之前是怎样解决的. 这对 data fix 尤其好用, 因为同一个问题出现 data 问题的几率相对比较高, 参考之前给出的脚本能减少很多劳动. Support
网站上有很多开发和 support 写的 Note, 查找关键字可以找到类似的问题. 这个对 code fix 非常好用. 如果之前已经解决这个 code 问题的话, 直接根据 note 打补丁就好了.

3. 如果 code fix 是不能重现的, 那么多数情况下, 这个问题已经被改过了. 客户由于文件版本较低, 还存在这个问题. 去上面两个网站去找相应的补丁.

4. 如果在这两个网站都没有找到相似的 bug, 那么恭喜你, 遇到了一个新的问题, 你要从头开始自己分析了.

5. 分析的工具无非就是 log. 看 log, 可以跟踪代码走到了哪里. 对我们 INV team 来说, 几个常用的 log 是:

a) INV log

INV log 记录了服务器端代码的流程, 就是 .pls 文件的 log. 如果在文件开头的地方有读取
FND_PROFILE.VALUE(‘INV_DEBUG_TRACE‘) 的话,
那么这个文件的日志就是记录在 INV log 里面的. 拿到这个日志, 对于分析代码走到了哪一步非常有用.

b) RTP log

RTP log 是记录系统跑 concurrent request: receiving transaction processor 所记录下的日志. 如果打过 9184617:R12.PO.A 这个patch, 也就是 rvtpt.lpc的版本要高于这个版本120.19.12000000.25  ,
那么就可以在 INV log 里面看到RTP 的 log 了. 如果没有打过这个patch, 那么就只能用老办法去收集了. 收集的办法是记录下 RTP id, 然后用下面的 SQL:

    select module, to_char(timestamp,'DD-MON-YYYY HH24:MI:SS'), message_text
    from fnd_log_messages
    where timestamp > sysdate - 2/24
    and process_id = ( select os_process_id from fnd_concurrent_requests where request_id = &request_id)
    and module like 'po%'

c) FRD log

FRD 的全称是 forms runtime diagnostics, 就是记录 form 运行时候所有触发器的日志. 这个里面可以清楚的看到触发器触发的顺序, 以及在里面做了什么事情. 如果客户的 bug 是属于 form runtime 进程报错的话, 里面就会显示在那个触发器里面报的错, 然后要做的事情就是看代码了.

d) SQL trace

SQL trace 记录的是数据库所有的操作的日志. 包括所有的操作语句, 绑定值, 性能问题, 还有 SQL 报错. 只要看报什么错, 找到那句 SQL, 差不多就解决了一半问题了.

e) fnd_new_messages

这是数据库的一个表, 记录了所有的错误信息. 如果客户报了一个错, 可以通过下面的 SQL 去找到对应的错误记录

select * from fnd_new_messages where message_text like 'Quantity entered should be less than or equal to available quantity%'

然后到代码里面去找到报错的地方就好了. 通常一个错误信息只在一个地方报出来, 所有很容易找到对应的代码.

通过上面的几个日志, 差不多能够定位到 bug 发生的代码了. 接下来的事情就是去 code fix 或者给客户提供脚本.

最后重要的一点就是, 无论 code fix 还是提供 data fix script, 都要让其他开发 review 一下, 以免出现问题.

拿到一个新 bug 怎样分析

时间: 2024-10-12 04:33:09

拿到一个新 bug 怎样分析的相关文章

分析Linux内核创建一个新进程的过程【转】

转自:http://www.cnblogs.com/MarkWoo/p/4420588.html 前言说明 本篇为网易云课堂Linux内核分析课程的第六周作业,本次作业我们将具体来分析fork系统调用,来分析Linux内核创建新进程的过程 关键词:fork, 系统调用,进程 *运行环境:** Ubuntu 14.04 LTS x64 gcc 4.9.2 gdb 7.8 vim 7.4 with vundle 分析 分析方法说明 PCB包含了一个进程的重要运行信息,所以我们将围绕在创建一个新进程时

第六周分析Linux内核创建一个新进程的过程

潘恒 原创作品转载请注明出处<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 task_struct结构: struct task_struct {   volatile long state;进程状态  void *stack; 堆栈  pid_t pid; 进程标识符  unsigned int rt_priority;实时优先级  unsigned int policy;调度策略  struct files

分析Linux内核创建一个新进程的过程

一.原理分析 1.进程的描述 进程控制块PCB——task_struct,为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. struct task_struct{ volatile long state; //进程状态,-1表示不可执行,0表示可执行,大于1表示停止 void *stack; //内核堆栈 atomic_t usage; unsigned int flags; //进程标识符 unsigned int ptrace; …… } 2.进程的创

实验六———分析Linux内核创建一个新进程的过程

分析Linux内核创建一个新进程的过程 攥写人:李鹏举  学号:20132201 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ) 本周要求: 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235: 分析fork函数对应的内核处理过

lab6:分析Linux内核创建一个新进程的过程

李俊锋 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验原理 1.进程的定义 进程是操作系统的概念,每当我们执行一个程序时,对于操作系统来讲就创建了一个进程,在这个过程中,伴随着资源的分配和释放.可以认为进程是一个程序的一次执行过程. 2.进程与程序的区别 程序时静态的,它是一些保存 在磁盘上得指令的有序集合,没有任何执行的概念. 进程是一个动态的概念,它是程序执行的过程

实验六:分析Linux内核创建一个新进程的过程

20135108 李泽源 阅读理解task_struct数据结构http://codelab.shiyanlou.com/xref/linux-3.18.6/include/linux/sched.h#1235: 分析fork函数对应的内核处理过程sys_clone,理解创建一个新进程如何创建和修改task_struct数据结构: 使用gdb跟踪分析一个fork系统调用内核处理函数sys_clone ,验证您对Linux系统创建一个新进程的理解,推荐在实验楼Linux虚拟机环境下完成实验. 特别

《Linux内核分析》 第六节 分析Linux内核创建一个新进程的过程

范闻泽 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验过程 1.删除原来的menu,并clone新的menu,用test_fork.c覆盖test.c 2. make rootfs之后新的内核启动,测试fork功能 3.使用-s -S冷冻内核,准备调试 4.设置断点 5.根据断点,进行跟踪,得到结果 1.以下是执行指令 cd LinuxKernel rm menu -r

linux内核分析 第六周 分析Linux内核创建一个新进程的过程

进程的描述 操作系统的三大管理功能:进程管理.内存管理.文件系统 为了管理进程,内核必须对每个进程进行清晰的描述,进程描述符提供了内核所需了解的进程信息. 进程控制块PCB task_struct:进程状态.进程打开的文件.进程优先级信息 task_struct总体数据结构的抽象: tty:控制台 fs:文件系统 files:文件描述符 mm:内存管理 signal:信号描述 进程的状态: 注意:Linux下,中就绪状态和运行状态都是TASK_RUNNING 一.gdb跟踪分析一个fork系统调

Linux内核设计第六周学习总结 分析Linux内核创建一个新进程的过程

陈巧然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.实验过程 登陆实验楼虚拟机http://www.shiyanlou.com/courses/195 打开shell终端,执行以下命令: cd LinuxKernel rm -rf menu git clone https://github.com/mengning/menu.git cd menu mv test_fork.c