最近每天早上登录到机器时总会见到core文件. 通过file命令发现这是由一个统计日报的程序产生的.
第一次调试:
使用gdb调试:
$gdb report_xx core
设断点(程序很小,所以直接设在main):
(gdb)break main
输入源程序目录:
(gdb)dir /xxx/yyy/src
运行:
(gdb)run
调试:
(gdb)n
...
(gdb)p
程序突然在一个sql后挂掉了(Line:260).
第二次, 在测试库中调试.
先在没有进行错误检测的sql语句后添加错误检测代码(判断sql语句的返回值^^). 编译 ...
$gdb report_xx
(gdb)break report_xx.cpp:250
(gdb)dir /xxx/yyy/src
(gdb)run
(gdb)n
这次我小心了, 按回车前仔细看下将要执行的代码.
执行完sql后,输入返回值:
(gdb)p sqlca.sqlcode
正常.
?! 执行下一条, 进入生成日志的函数-log
(gdb)s
一路next后, 程序在fwrite函数报错. Oh, my God! 打开文件后没有判断是否成功. 添加代码:
if (NULL == fp)
{
printf("打开文件失败!\n");
return ; // 无返回值
}
读相应代码时发现, 程序试图到一个不存在的目录打开一个文件 =_=!
修改, 调试, OK!
(Over!)
总结:
打开文件后一定要进行错误检测.
-------------------------------------------------------------------
此次用到的gdb命令:
调试core文件:
gdb filename core
单步跟踪(可以进入函数)
s
执行下一条语句(不进入函数)
n
输入变量值
p 变量
设置断点
break function_name
break filename.cpp:line_number
阅读(1476) | 评论(0) | 转发(0) |