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 jmzw@boss15test >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
dbtool一bug跟踪记相关推荐
- 项目管理大法归档 - 思维导图、原型工具、接口测试、设计模式、版本管理、单元测试、持续集成、代码审查、Bug 跟踪
项目管理大法归档 - 思维导图.原型工具.接口测试.设计模式.版本管理.单元测试.持续集成.代码审查.Bug 跟踪 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) ...
- bug诞生记——临时变量、栈变量导致的双杀
这是<bug诞生记>的第一篇文章.本来想起个文艺点的名字,比如<Satan(撒旦)来了>,但是最后还是想让这系列的重心放在"bug的产生过程"和" ...
- 消灭Bug!推荐7款优秀的开源Bug跟踪工具
摘要: 在这个充满 bug 的世界里,最遥远的距离不是生与死,而是你亲手制造的 bug 就在你眼前,你却怎么都找不到她. 在过去几年里,程序员改变着世界,然而,我们手中诞生的每个新网站或 APP 都面 ...
- 开发工具:收集12 个顶级 Bug 跟踪工具,值得收藏!
作者 | Eugene Stepnov 译者 | 张健欣 策划 | Tina 来源丨架构头条(ID:ArchFront) 在如今的在线世界,几乎所有的公司都面临它们产品中的 bugs,并且考虑如何管理 ...
- [MOSS开发]:通过简单BUG跟踪Demo阐述用户控件对列表的操作
下面的文章我想以一个具体的BUG跟踪Demo来说明MOSS的具体应用,这里面会应用到下面的知识点: 1:用户组,用户的创建,权限分配: 2:列表的概念以及创建: 3:利用用户控件来完成表单的增加加功能 ...
- [异常特工]android常见bug跟踪
前言 对app的线上bug的收集(友盟.云捕等)有时会得到这样的异常堆栈信息:没有一行代码是有关自身程序代码的.这使得对bug的解决无从下手,根据经验,内存不足OOM,Dialog关闭,ListVie ...
- Bug消灭记:透明 png 图片加水印后变成黑问题
背景 本周四晚下班后,领导火急火燎地电话我,说公司某个产品的系统配置模块在配置登录 Logo 的时候,上传一个透明底色的 png 图片,结果变成了黑色背景色,让我修复一下这个 Bug . 领导初步怀疑 ...
- BugTrap:程序崩溃快照、bug跟踪之利器
来源:清泛网 http://www.tsingfun.com/html/2016/debug_0412/1354.html BugTrap的github官网地址:https://github.com ...
- bug生命周期bug跟踪处理
一.BUG BUG:软件的缺陷 1.BUG的定义:----与软件测试的目的对应 软件的BUG,狭义概念是指软件程序的漏洞或缺陷,广义概念除此之外还包括测试工程师或用户所发现和提出的软件可改进的细节.或 ...
最新文章
- Linux-CentOS 7 增加root分区容量
- SQL For Xml
- 菜鸟requireJS教程---1、初识requirejs
- 40万总奖金!顶级云服务免费用!2021全球高性能云计算创新大赛报名中!
- VTK:InfoVis之WordCloud
- 使用hiredis实现redis分布式锁
- 【数据库系统设计】关系数据库标准语言SQL(1)
- 2万字总结《MybatisPlus—为简化开发而生》
- 线程池ThreadPoolExecutor里面4种拒绝策略
- JavaScript视频教程
- Overlay网络技术之vxvlan
- ManualResetEvent
- 差分 线宽 线距_做设计时线宽、线距规则设置多大比较好?
- vue中报warnings potentially fixable with the `--fix` option.
- Git学习笔记(二)——Git的分支管理、储藏和标签
- 解决进不去BIOS或U盘启动,windows10如何关闭快速启动
- javascript 打印错误信息 catch err
- 2022哈工大(深圳)计算机854考研经验贴|双非跨考|初试367 复试293
- 服务器(CentOS7)配置R以及R Studio Server
- 如何简单设计接口测试用例