前面文章只是给出简单演示,实际的程序运行中会遇到这样或那样的问题。所以,本文结合笔者实际编程经历,给出一些曾经遇到过的实际例子。

笔者遇到的大多数程序崩溃原因,基本上都是段错误:非法内存使用,越界。这就要在程序编码中注意代码的质量了。比如使用指针前必须先判断其合法性,释放指针后及时将指针置为NULL,使用数组注意不能超出其范围,等等。

指针非法

下面的例子是笔者前段时间进行的onvif程序的片段。调试过程如下:

GNU gdb (Ubuntu 7.7-0ubuntu3.1) 7.7
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "i686-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from a.out...done.
[New LWP 22255]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/i386-linux-gnu/libthread_db.so.1".
Core was generated by `./a.out'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x083e95b2 in WsddProxyImpl::discoverDevices (this=0xa617628, ip=0x0) at src/onvifwsddProxyImpl.cpp:131
131                 matchDevice.Scopes = resp.wsdd__ProbeMatches->ProbeMatch->Scopes->__item;
(gdb) bt
#0  0x083e95b2 in WsddProxyImpl::discoverDevices (this=0xa617628, ip=0x0) at src/onvifwsddProxyImpl.cpp:131
#1  0x083b3d41 in OnvifClient::test (this=0xa5eb008, ip=0x0) at src/onvifClient.cpp:65
#2  0x083b3a0f in main_cpp (argc=1, argv=0xbfcc7ec4) at main.cpp:27
#3  0x083b39c8 in main (argc=1, argv=0xbfcc7ec4) at main.cpp:17

从gdb信息中看到出现问题地方为resp.wsdd__ProbeMatches->ProbeMatch->Scopes->__item,这么多级的指针,可能是中间某个指针非法,所以应该在代码中逐级判断。
实际原因:resp.wsdd__ProbeMatches->ProbeMatch->Scopes指针为空。

注:笔者在实际工作中就遇到一个RTSP模块使用多级指针但不做判断的情况,由于接手的程序庞大又不熟悉架构,而且还是在特定方案中出现,所以排查起来很麻烦,所幸用coredump还是能定位到问题所在。

vector使用方式

下面的例子同样是onvif程序,是vector使用方式不恰当导致。

Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x083deb46 in DeviceBindingProxyImpl::getServices (this=0xa383ff8, services=...) at src/onvifDeviceBindingProxyImpl.cpp:68
68                  services_[i].VersionMajor = resp.Service[i]->Version->Major;
(gdb) bt
#0  0x083deb46 in DeviceBindingProxyImpl::getServices (this=0xa383ff8, services=...) at src/onvifDeviceBindingProxyImpl.cpp:68
#1  0x083af56a in OnvifClient::test (this=0xa33a008, ip=0xbf88d91e "172.18.45.16") at onvifClient.cpp:101
#2  0x083af024 in main_cpp (argc=2, argv=0xbf88bdd4) at main.cpp:24
#3  0x083aefc4 in main (argc=2, argv=0xbf88bdd4) at main.cpp:10

代码片段:
    for (unsigned int i = 0; i < resp.Service.size(); i++)
    {
        odt__Service tmp;
        tmp.Namespace = resp.Service[i]->Namespace; // 先给临时变量存储
        tmp.XAddr = resp.Service[i]->XAddr; // 先给临时变量存储
        if (resp.Service[i]->Version)
        {

// 此处出现错误,在vector没有确定容器大小时,不能这样搞。。。
            services_[i].VersionMajor = resp.Service[i]->Version->Major; 
            services_[i].VersionMinor = resp.Service[i]->Version->Minor;           
        }
        services_.push_back(tmp); // push_back,vector会自动增长
    }

注:std::vector为空情况下,不能直接用[i].XXX的方法来赋值,可以调用resize()预先设置大小。不过最好的是使用push_back。

后续可能也许会不定时更新本文。

李迟 2016.5.31 周二 晚

Linux下coredump调试2:实例相关推荐

  1. Linux下coredump调试1:使用

    李迟按: 调试是程序员的一项基本能力,经历过大大小小的实战,随着见识的增长,只要用心留意并做总结,相信调试的能力会越来越好.写程序不可能没有bug,只是bug容易不容易被发现,bug的危害大不大.笔者 ...

  2. Linux下coredump调试3:补录

    本篇文章记录在coredump调试过程中记录的其它事项. 一般地,调试的方式多种多样,不可能将其一网打尽.就笔者而言,一般喜欢用print大法,分段注解法,版本回退法,等等.实在无招,则用coredu ...

  3. gdb 调试_一文入门Linux下gdb调试(二)

    点击"蓝字"关注我吧 作者:良知犹存 转载授权以及围观:欢迎添加微信号:Conscience_Remains 总述     今天我们介绍一下core dump文件,Core dum ...

  4. linux gdb网络调试,一文入门Linux下gdb调试(二)

    本文转载自[微信公众号:羽林君,ID:Conscience_Remains] 总述 今天我们介绍一下core dump文件,Core dump叫做核心转储,它是进程运行时在突然崩溃的那一刻的一个内存快 ...

  5. linux下TCP通信简单实例

    linux下TCP通信简单实例 基于TCP(面向连接)的socket编程,分为服务器端和客户端 服务器端的流程如下: (1)创建套接字(socket) (2)将套接字绑定到一个本地地址和端口上(bin ...

  6. linux下gdb调试方法和技巧详解

    linux下gdb调试方法和技巧整理 简介 UNIX或者UNIX-like下调试工具 启动gdb # 1. 在可执行程序不需要输入参数时,我们可以使用 gdb + 可执行程序 gdb ./typeid ...

  7. linux下手动删除数据库实例

    linux下手动删除数据库实例,直接删除相应的目录就可以了,不多说了.... 1. $ORACLE_HOME/dbs/ [oracle9@frogger dbs]$ pwd /u01/app/orac ...

  8. linux中grep的例子,Linux下grep命令使用实例

    那么你知道grep命令参数.如何使用grep命令去搜索某个文件中的内容呢.grep 命令递归查找.使用grep去匹配某一个单词么?接下来是小编为大家收集的Linux下grep命令使用实例,欢迎大家阅读 ...

  9. Linux下串口调试及使用shell编程接收数据

    串口简介 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用.常用的串口是 RS-232-C 接口(又称 EIA RS-232-C)它是在 1970 年由美国电子工业协会(EIA)联 ...

最新文章

  1. 服务器端linux发行版的选择
  2. 获取元素相对于屏幕的位置
  3. Vue.js 列表渲染
  4. caffe data层_Caffe实现多标签输入,添加数据层(data layer)
  5. 内核隐藏进程(源码)
  6. richtextbox自动滚动到最下面_自动滚动式连续真空包装机简介
  7. 为什么要娶就娶电力女?!
  8. 第三章 MongoDb Java应用 3.2
  9. 安装composer以及laravel框架
  10. idea yml变成文件了_初识SpringBoot之配置文件(二)——配置文件值注入
  11. oracle chinese_china.al32utf8,Oracle11g字符集更改为AL32UTF8
  12. php 安装pdo odbc,php如何安装pdo odbc扩展
  13. 新型开关电源优化设计与实例详解全书.pdf_高频电路设计中,如何应对“不理想”的电容与电感?...
  14. java查询F分布表
  15. python群控模拟安卓系统_安卓群控系统模拟器
  16. 机器学习之K均值聚类算法
  17. 扇贝单词里有计算机英语吗,扇贝单词记录
  18. 监控记录交换机端口流量及性能,MSRM3一分钟搞定
  19. 图像处理(三)——中国传统工艺画风格的图像转换应用
  20. BM27 按之字形顺序打印二叉树

热门文章

  1. 女孩子怎样能赚到月薪一万
  2. 三款旗舰手机、四大高端生态新品,Redmi发布K50系列等七大重磅新品
  3. 厉害了!同事请假参加冬奥会顺手得了铜牌:系知名涂料公司员工
  4. 关店9000家,市值蒸发90%,女装巨头大崩溃的根源找到了
  5. iPhone 13凌晨发布,电池容量较iPhone 12最高有望提升20%(文末有福利)
  6. 支付宝上线宠物防走丢功能
  7. 疑似小米平板5通过3C认证:搭载8720mah双电芯方案
  8. 315记者卧底销售公司成为二把手:待遇比原来高多了,差点不想回来
  9. 小米员工疑似上手小米11新机:骁龙888首发在即
  10. 小米POCO X3开启预热:支持33W闪充5160mAh大电池65分钟搞定