Linux下coredump调试2:实例

原创 2016年05月31日 22:02:20

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

笔者遇到的大多数程序崩溃原因,基本上都是段错误:非法内存使用,越界。这就要在程序编码中注意代码的质量了。比如使用指针前必须先判断其合法性,释放指针后及时将指针置为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。


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


李迟 2015.5.31 周二 晚

版权声明:本文为迟思堂主人李迟原创文章,如转载请注明出处,并附带原文超链接地址。用于商业用途请付稿费¥100/千字。谢谢。 举报

相关文章推荐

用gdb调试core文件

GDB是一个强大的命令行调试工具。大家知道命令行的强大就是在于,其可以形成执行序列,形成脚本。UNIX下的软件全是命令行的,这给程序开发提代供了极大的便利,命令行软件的优势在于,它们可以非常容易的集成...

公司内部文档安全软件coredump分析实例

系统: windows xp sp3 崩溃软件: 公司内部某文档安全软件 调试工具: windbg 反汇编工具: ida pro 5.5 介绍: 该文档安全软件是由公司内部vpn工具启动,...

精选:深入理解 Docker 内部原理及网络配置

网络绝对是任何系统的核心,对于容器而言也是如此。Docker 作为目前最火的轻量级容器技术,有很多令人称道的功能,如 Docker 的镜像管理。然而,Docker的网络一直以来都比较薄弱,所以我们有必要深入了解Docker的网络知识,以满足更高的网络需求。

GDB调试core文件样例(如何定位Segment fault)

core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump. (linux中如果内存越界会收到SIG...

学会用core dump调试程序错误

前言   最近在项目中遇到大型程序出现SIGSEGV ,一直不知道用core dump工具来调试程序,花了近一周的时间,才定位问题,老大很生气,后果很严重,呵呵,事后仔细学习了这块的知识,了解一点...

Linux下coredump调试1:使用

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

linux coredump配置与调试

Core Dump配置与调试 1.core文件的生成开关和大小限制 --------------------------------- 1)使用ulimit -c命令可查看core文件的生...

linux coredump调试,ulimit设置

1 )如何生成 coredump 文件 ? 登陆 LINUX 服务器,任意位置键入        echo "ulimit -c 1024" >...

linux coredump配置与调试

Linux Core Dump 配置与调试 1.core文件的生成开关和大小限制 ---------------------------------  1)使用ulimit -c...

linux coredump配置与调试

LinuxCore Dump 配置与调试1.core文件的生成开关和大小限制---------------------------------1)使用ulimit-c命令可查看core文件的生成开关。...

linux coredump配置与调试

Linux Core Dump 配置与调试1.core文件的生成开关和大小限制---------------------------------1)使用ulimit -c命令可查看core文件的生成开...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)