Chinaunix首页 | 论坛 | 博客
  • 博客访问: 467461
  • 博文数量: 65
  • 博客积分: 2645
  • 博客等级: 少校
  • 技术积分: 675
  • 用 户 组: 普通用户
  • 注册时间: 2006-01-08 17:04
文章分类

全部博文(65)

文章存档

2010年(5)

2009年(5)

2008年(14)

2007年(35)

2006年(6)

分类: C/C++

2007-07-03 11:44:14

    最近每天早上登录到机器时总会见到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

   
   
        
阅读(1442) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~