在前几篇中,虽然已经实现了rtsp视频流的对接,但是还要做的工作还非常多,onvif本来就是一个覆盖面非常广的一个协议,每一个功能都要填充大量的函数。而且稍不注意就会出现segmentation fault错误。下面把我之前开发调试时的经验写下来,希望能够帮助有这方面需求的人。【来自http://blog.csdn.net/ghostyu】

1、打开onvif调试开关,以便让onvif打印一些可用的调试信息。

在Makefile中添加调试宏定义如: CC = gcc -DDEBUG

2、打开调试宏后,默认在程序运行的目录产生三个文件:

RECV.log

SENT.log

TEST.log

RECV.log是onvif接收到的SOAP数据,没接收一条,都会在RECV.log中记录

SENT.log是onvif发送出去的SOAP数据,没发送一套,也会在SENT.log中生成记录

最后是TEST.log,如果说RECV和SENT可以用wireshark工具抓包代替,那么TEST.log是谁也替代不了的,TEST.log记录了onvif的实时的工作状态。

尤其当出现segmentation fault错误,TEST.log就成了唯一一个能够定位到具体内存出错的地方了。

3、最常见的错误:segmentation fault错误的解决方法

segmentation fault错误是onvif开发过程最常见的错误,至少我是这样的,主要是由于访问了没有分配地址的内存导致的,在填充功能函数时,很容易漏掉为必须的结构体分配内存,导致gSoap产生的代码会在不知情的状况下访问该结构体,然后报segmentation fault错误。那如何快速的定位到内存出错的地方呢?

有人说使用GDB、在这里GDB调试工具起不到什么作用的,因为GDB定位到的内存访问错误,是真的定位到访问时的那一条代码,而onvif中访问结构体内存的代码是有gSOAP自动产生的,代码本身并没有错,是最高一层的填充错误,这时候gdb就显得无能为力了。只能通过TEST.log定位。

我故意将将成员变量Uri的内存非配注释掉,然后编译运行程序,出现内存错误:

虽然我在函数里,打印了一条信息,表明出错的函数,现在我们完全可以忽略该信息,直接看TEST.log

出现内存错误等致命错误,程序会立刻结束,所以打开TEST.log直接看最后面的信息

  1. Element begin tag='SOAP-ENV:Body' level='1' id='0' type=''
  2. Lookup location=0xbfd44a30 type=1548: not found
  3. Element begin tag='trt:GetSnapshotUriResponse' level='2' id='0' type=''
  4. Element begin tag='trt:MediaUri' level='3' id='0' type=''
Element begin tag='SOAP-ENV:Body' level='1' id='0' type=''
Lookup location=0xbfd44a30 type=1548: not found
Element begin tag='trt:GetSnapshotUriResponse' level='2' id='0' type=''
Element begin tag='trt:MediaUri' level='3' id='0' type=''

最后一条显示的Element begin tag=' trt:MediaUri',说明程序在开始编码trt:GetSnapshotUriResponse的trt:MediaUri出了问题,这里回过头来看源代码,


结构体的第一条就是Uri,假如我注释的并不是Uri,而是__any等,那么TEST.log中的最后一条就肯定不是上面那样子的,我们可以再一些测试,说明TEST.log对于查找错误的重要性。

修改的程序如下:

重新运行程序,运行到这段代码的时候就会产生一个内存错误,我们再次打开TEST.log

从打印的信息来看,tt:Timeout已经编码结束了,然后才出现的问题,这是再看看源代码中Timeout后面的成员变量是什么

所以就很快的定位到出错的地方了。

但是如果使用gdb调试会是什么样的呢,还是可以做一下测试:

这能看出什么啊?对于调试onvif,gdb就显得那么多余了。。。

onvif规范的实现:onvif开发常用调试方法 和常见的segmentation fault错误的更多相关文章

  1. VC的常用调试方法

    前言 VS是非常强大的IDE,所以掌握VSVC的常用方法,将会使得我们找出问题解决问题事半功倍. 目录 VSVC的常用调试方法 前言 1. Watch窗口查看伪变量 2. 查看指针指向的一序列值 3. ...

  2. PyCharm Django项目开发的调试方法

    下面介绍两种PyCharm Django项目开发的调试方法: 方法一: 1. 使用PyCharm 自带的django项目Debug工具, 当然前提条件是django项目环境已经搭建好了. 2. 在代码 ...

  3. Web开发常规调试方法与常见问题分析

    一.Web项目基本原理 现在的web项目大都已经前后端独立开发与部署. 前后端独立开发,一般是前端与后端通过web接口(常见的有RESTful与websocket)文档进行交流.前端开发人员先更具业务 ...

  4. shell 脚本常用调试方法

    曾经我刚开始学习 shell 脚本时,除了知道用 echo 输出一些信息外,并不知道其他方法,仅仅依赖 echo 来查找错误,比较难调试且过程繁琐.效率低下.本文介绍下我常用的一些 shell 脚本调 ...

  5. [转载]Android开发常用调试技术记录

    ANDROID 调试技术: 1)Ps 指令 ls –l /proc/27/ cat /proc/27/cmdline       #cmdline文件表示了这个进程所在的命令行. cat /proc/ ...

  6. iPhone页面的常用调试方法

    在iPhone中调试,大体上与上文 安卓中的移动页面调试 类似,区别主要是iOS系统中的一些限制,导致某些工具无法使用. 本文基于此,简要介绍在iPhone中如何调试页面. 最终可以实现在Mac平台使 ...

  7. Makefile常用调试方法

    转载自 陈皓<跟我一起写 Makefile><GNU Make项目管理> GNU make 提供了若干可以协助调试的内置函数以及命令行选项. 1.warning函数 $(war ...

  8. Web开发(调试方法 F12)

    参考: 参考:MDN 调试HTML 参考:什么是浏览器开发者工具? 参考:检查和编辑页面与样式 工具参考:标记验证服务 工具参考:直接输入验证(直接输入HTML源码进行在线检查) 目录: 1.相关快捷 ...

  9. ios开发之--调试方法

    概述 基本操作 全局断点 条件断点 开启僵尸对象 LLDB命令 概述 在开发项目的工程中,肯定会遇到各种各样的bug,且大多数的bug都和自己有关:那么在和bug斗智斗勇的过程中,如果能快速准确的一击 ...

随机推荐

  1. 【COCOS2DX-对28游戏开发】 Cocos2d-x-3c 道路设计 CocosBase CocosNet CocosWidget

    原文链接:http://blog.csdn.net/cocosviva/article/details/18970717 另一个比較不错的cocos2dx扩展库:https://github.com/ ...

  2. Js获取Gridview中Dropdownlist选中状态

    在Gridview中加入Dropdownlist模板列,加入DropDownlist 是一种常用的操作,其中涉及到如何获取选择项和Gridview重新绑定两个要点. 如图 前台代码如下 <%@ ...

  3. C#基础学习心得(一)

    类的成员 数据成员:字段,常量(const) 函数成员:方法,属性,索引器,构造函数,析构函数,事件 类的声明 实例成员:对象相关性,不同于同一类的其他实例 静态成员:常量,static修饰的字段,方 ...

  4. 【转载】ADO.NET与ORM的比较(3):Linq to SQL实现CRUD

    [转载]ADO.NET与ORM的比较(3):Linq to SQL实现CRUD 说明:个人感觉在Java领域大型开发都离不了ORM的身影,所谓的SSH就是Spring+Struts+Hibernate ...

  5. Windows Phone 学习教程(一)

    http://www.cnblogs.com/webabcd/category/385852.html Windows Phone 7 教程 Windows Phone 8.1 Windows Pho ...

  6. QT皮肤框架-TQUI

    本皮肤框架的相关文档,请在附件中下载,包括测试程序源码,帮助文档.相关文档可到我的百度网盘中下载,或者在本贴附件中下载. 百度网盘地址:TQUI-V1.0项目说明及测试程序源码 项目更新说明:---- ...

  7. Get Start StrangeIOC for Unity3D

    好久没有发blog了,因为只发原创内容,而去年发布的那几篇后来发现随便百度到处都是转载的或者各种网站自动扒的,我觉得既然大家都不尊重这种东西就没必要发上来了!不过由于工作原因最近在看Unity的一个I ...

  8. sql每五秒插入一条数据 一次插入N条数据

    1建立数据表 create table projectManage ( ID int identity primary key not null, projectName )not null, man ...

  9. linux服务器之间拷贝文件和文件夹

    传输文件用法:scp 本机文件目录 远程服务器用户名@服务器IP:/服务器目录 示例:

  10. Delphi线程同步(临界区、互斥、信号量,包括详细代码)

    当有多个线程的时候,经常需要去同步这些线程以访问同一个数据或资源. 例如,假设有一个程序,其中一个线程用于把文件读到内存,而另一个线程用于统计文件的字符数.当然,在整个文件调入内存之前,统计它的计数是 ...