dbtool一bug跟踪记

  注:这篇日志是好多年前,我还在从兴公司时写的。现在都从从兴公司离职很久了,从兴也没落了,可惜。看了一下,虽然出现了部分代码,但不至于泄漏什么机密,查bug过程的原理也有可以让新手借鉴的地方,就原文照搬上来了。

  dbtool是营帐研发部常用的一个类sqlplus数据库查询工具,它提供了较sqlplus更友好的输出界面,十分适合在命令行下操作,故在部门内部使用相当广泛。

不过它一直有一个bug,使用过程中偶尔会出现执行某条sql后core down的情况。但是由于这种情况较少见,而且bug出现随机性太大,所以一直也没人去管它。

今天早上加班过程中,居然又让我碰上这个bug了。不过这次bug很有规律,每次连接上数据库后立即执行“select userenv(‘language‘) from dual;”程序立即core down。

由于是周日,比较有空,而且天赐良机,居然能重现bug,于是决定花点时间解决这个bug。

首先使用dbx看一下程序在哪core

Segmentation fault(coredump)
bbkf:/home/report/c++/report/dbtool$dbx dbtool
Type ‘help‘ for help.
[using memory image in core]
reading symbolic information ...

Segmentation fault in malloc_y at 0x90000000005bb10 ($t1)
0x90000000005bb10 (malloc_y+0x5a4) 90050000         stw   r0,0x0(r5)
(dbx) where
malloc_y(0xa1, 0x0, 0x0, 0x7f7f7f7f, 0x2, 0x2d2d0049, 0x2d, 0x100233704) at 0x90000000005bb10
malloc_common_79_63(??) at 0x900000000058948
_Fancy_malloc__FUl(??) at 0x900000000451ae4
__nw__FUl(??) at 0x9000000004517c0
_Allocate__3stdHc_UlPc_Pc(??, ??) at 0x9000000004c5834
allocate__Q2_3std9allocatorXTc_FUlPCv(??, ??, ??) at 0x9000000004c57c4
_Copy__Q2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__FUl(??, ??) at 0x9000000004c564c
_Grow__Q2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__FUlb(??, ??, ??) at 0x9000000004c4ec8
assign__Q2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__FPCcUl(??, ??, ??) at 0x9000000004c4bac
assign__Q2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__FPCc(??, ??) at 0x9000000004c4974
__ct__Q2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__FPCc(??, ??) at 0x9000000004c4880
GetColNameDisplay(std::basic_string<char,std::char_traits<char>,std::allocator<char> >&,std::basic_string<char,std::char_traits<char>,std::allocator<char> >&)(this = 0x0fffffffffffaba8, colsName = &(...), prompt = &(...)), line 884 in "cmdDeal.cpp"
GetDBData(int)(this = 0x0fffffffffffaba8, bAutoContinue = 0), line 580 in "cmdDeal.cpp"
CCmdDeal::Run()(this = 0x0fffffffffffaba8), line 273 in "cmdDeal.cpp"
main(argc = 2, argv = 0x0ffffffffffff338), line 249 in "dbtool.cpp"
(dbx)

  从上面可以看到,出错位置在string里面,根据经验,这种bug好解决,一般是string操作错误,例如将一个没有\0结尾的字符数组赋值给string

用vi打开cmdDeal.cpp,定位到884行,发现如下代码

  +875  int CCmdDeal::GetColNameDisplay(string &colsName, string &prompt)
  +876  {
  +877          char chSplit = ‘ ‘;
  +878          int i, len = 0;
  +879          int rows = 0;
  +880          int maxNameLen = 0;
  +881          int lineSize = 0;
  +882          int displayMode = 0;
  +883          string s;
  +884          string str45 = "-------------------------------------------------------------------"
  +885                                     "-------------------------------------------------------------------";

居然是正常的字符串初始化出错! 这就郁闷了,这行代码怎么看都是正常的,根据经验,这种正常的代码出错,一般是由于前面某个位置出现了越界操作导致的。这种错误相对难查很多。

浏览了一下附近的代码,都没发现什么异常的代码,于是只能加上一些调试代码看能不能找出问题。经过一番尝试后发现,在GetColNameDisplay里面初始化长度较大的字符串就会导致程序core down。并且这个规律在GetDBData(调用GetColNameDisplay的函数)里面也有效。

这就好办了,只要找出在哪段代码执行后会出现这种奇怪的现象,问题代码应该就在那。

  于是在程序里面加了N多个下面的代码片段

1 {
2     string str45 = "-------------------------------------------------------------------"
3                                        "-------------------------------------------------------------------";
4 string str451 = "-------------------------------------------------------------------"
5                                        "-------------------------------------------------------------------";
6     printf("[%s:%d]\n", __FILE__, __LINE__);
7 }

上面的调试代码特意括在大括号里面的,目的有两个,

  1 括号使得str45变成局部变量,这样不会出现变量冲突

  2 保证str45尽快析构,以免影响错误定位

  加上代码后编译运行,看程序在哪两行代码之间挂掉,接着在那两行代码中间增加更多调试代码,反复运行,很快就定位到了出错函数GetColumnInf。程序在调用这个函数之前调试代码执行不会有问题,在之后就挂了。GetColumnInf这个函数比较短,仔细看了一下,发现下面这段代码可能有问题。

 1 vector<ColInf>::iterator it = m_vecColInf.begin();
 2     int Index = 1;
 3     COciCursor        cur( *m_pOracle );
 4     COciColumnDesc    coldesc;
 5
 6     cur.Parse(strSql.c_str());
 7
 8     do
 9     {
10         cur.DescribeColumn( Index, coldesc );
11         if (it->type != 12 && it->type != 1)
12         {
13             it->prec = it->type==12 ? it->prec : coldesc.m_Prec;
14         }
15         it++;
16         Index++;
17     } while ( !cur.EndOfDesc() );
18     cur.Close();

  代码里面对it操作时,没有判断it是否越界,整个函数看起来就这个最可能出现问题了。试着给while循环加了一个判断条件变成“while ( !cur.EndOfDesc() && it != m_vecColInf.end() );”

重新编译运行。

1 [email protected] >select userenv(‘language‘) from dual;
2
3 USERENV(‘LANGUA
4 -------------------------
5 AMERICAN_AMERICA.ZHS16GBK
6
7 1 rows selected.

  猜对了,程序能正确输出,不会再core掉! 接下只需要分析这段代码为何会越界,修复即可。不过一看时间已经十一点多,不知不觉浪费了近半个上午,而且这段代码看起来作用只是获取数据库字段精度,不是很重要,所以此次根跟踪到此为止吧。

  此次收获经验:写代码还是谨慎点,加多一些边界判断比较好,不然贪图一时方便可能导致花大把时间在定位bug

原文地址:https://www.cnblogs.com/kingstarer/p/9638143.html

时间: 2024-11-05 22:35:34

dbtool一bug跟踪记的相关文章

项目管理大法归档 - 思维导图、原型工具、接口测试、设计模式、版本管理、单元测试、持续集成、代码审查、Bug 跟踪

太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 项目管理大法归档: 1.思维导图 如果你在想事情,而又不那么清晰明确,那么就用思维导图吧,它可以随着你的思维,很自然地记忆你思维的过程. 其实使用

Bug跟踪的流程

本文以翼发云协同项目管理系统为例子来讲解Bug跟踪的流程,它以工作流为中心的集成式Bug跟踪软件,它广泛地应用于研发行业的产品缺陷管理 与跟踪.事务跟踪.问题跟踪.任务跟踪.查询跟踪.需求管理.变更跟踪.企业帮助台和客户服务台等诸多范畴. 该系统提供了一个可靠的中央数据库集中管理多渠道提交至系统的信息,然后由系统按事先定义的条件和流程, 自动分配任务给相关的负责人员.公司员工与部门.部门与 部门.公司与客户之间能在任何时间.任何地点通过简便易行的方式进行 协作和信息交流,并且使任何记录都有据可查

线上应用bug跟踪查找-友盟统计

线上的应用只要用心点点都能发现些bug,连微信,QQ也不列外.但是bug中最严重的算是闪退了,这导致了用户直接不能使用我们的app. 我们公司是特别注重用户反馈和体验的,我们会定期打电话咨询用户的使用情况.我们也有自己的天使用户群,这些用户会跟我们及时的反馈应用的使用情况,bug情况,还有他们的需求. 用户不是技术人员他无法跟你清楚的描述怎么产生闪退的,于是我们需要一个bug统计的功能,我们公司采用友盟统计实现bug的记录.我们在iOS应用中植入友盟统计的功能,我也经常在查看友盟的错误统计和错误

bug跟踪工具——禅道

项目管理实践【四】Bug跟踪管理【Bug Trace and Management】

首先,向大家说一声抱歉,这篇文章耽误了这么久才和大家见面.至于Bug的跟踪和管理的必要性和好处,我就不在这里说了,下面介绍几款Bug跟踪和管理的软件. 一.BugNET BugNET是一个非常优秀的开源软件,基于.NET Framework2.0 ,使用ASP.NET+SQL Server开发的网站项目, 另外项目中还使用了Microsoft Report Viewer Redistributable 2005和Microsoft ASP.NET AJAX 1.0. 最新版本是:BugNET 0

那不是Bug,是新需求

原文作者:Jeff Atwood 自从我干上软件开发这一行,并且使用了Bug跟踪系统,我们在每一个项目里都会纠结一个基本的问题:你怎么能把Bug与功能需求区分开来? 当然,如果程序崩溃了,这毫无疑问是Bug.不过,那也许只占你每天所处理问题的10%.为了避免项目的彻底失败,真正的杀手级Bug--有它存在就不能发版的Bug--会很快被消灭.而在Bug跟踪系统里留下来的绝大部分Bug,就落入了没人管的灰色地带.用户报告的是Bug吗?不完全是.用户在要求一个新功能或完善某个既有功能吗?也不完全是.好吧

【软件分析与挖掘】BOAT: An Experimental Platform for Researchers to Comparatively and Reproducibly Evaluate Bug Localization Techniques

摘要: 目前有许多的bug定位技术,但是,由于他们基于不同的数据集,而且有些数据集还不是公开的,甚至有些技术只应用于小数据集,不具有通用性,因此,不好比较这些技术之间的优劣. 因此,BOAT应运而生.BOAT是指:Bug lOcalization experimental plATform.这是一个web平台,开发者注册之后,可以在这上面上传他们的bug定位技术,因为在这个平台上测试的数据集是相同的,所以与其他的bug定位技术具有可比性. 地址:http://www.vlis.zju.edu.c

【软件测试】程序不改bug,先别动手,听我说

前言 今天的话题,是所有测试员都会经历的,也多为此苦恼过.墨白借此谈谈自己的看法,不求解决现状,只希望大家看完此文后能少一些苦恼. 现状分析 之前,墨白身边一位测试老人提了一个打印文字溢出的缺陷,但该缺陷的负责人,一个年轻的程序员以项目临近上线没时间修改,且该缺陷影响很小而驳回,态度强硬(强硬的诉苦),那位测试专家从开始的坚持到最后无奈妥协,让墨白感触良多. 程序员为什么不愿意修改bug? 无非是没时间,问题太小,重现不了,理解不了,在实际环境中不太可能发生,问题只出现在没有人用的非常特殊的设备

将BUG管理工具(禅道)部署到服务器(测试服务器、云服务器)

禅道是一个开源的项目管理软件,用来记录软件项目的开发过程.bug跟踪以及任务分配,它是基于PHP语言开发的. https://www.zentao.net/download/80111.html .首先要做就是搭建禅道的运行环境.我们整理了不同平台的安装方法, 请参考下面的链接,选择适合自己的安装方式: 使用云禅道在线服务(禅道专业版 + svn + git)! windows使用一键安装包(推荐) linux使用一键安装包安装(推荐) 使用源码包安装(各系统通用) 不管使用什么样的方式安装禅道