在前几篇中,虽然已经实现了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直接看最后面的信息

[plain] view plaincopyprint?
  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就显得那么多余了。。。

转载于:https://www.cnblogs.com/shakin/p/3714850.html

onvif规范的实现:onvif开发常用调试方法 和常见的segmentation fault错误相关推荐

  1. 饥荒联机版Mod开发——常用inst方法(八)

    饥荒联机版Mod开发--常用inst方法(八) 前言 生成实体 监听/推送事件 使用标签 增删组件 网络组件 定时/阶段任务 回调函数 父子实体 平台 删除 位置,角度 显示/隐藏 判断 大脑 状态图 ...

  2. 用GDB调试Segmentation Fault错误

    调试Linux程序的时候,出现Segmentation Fault是最郁闷的事情了,程序代码量很大的时候,可能花很多时间都找不到出错原因.        这里介绍一种对你调试Segmentation ...

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

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

  4. 瑞芯微读取寄存器_经验-瑞芯微RK3399嵌入式开发板调试方法-电路城论坛 - 电子工程师学习交流园地...

    RK3399的CPU采用big.LITTLE大小核架构,双Cortex-A72大核+四Cortex-A53小核结构,对整数.浮点.内存等作了大幅优化,在整体性能.功耗及核心面积三个方面都具革命性提升. ...

  5. [Phonegap+Sencha Touch] 移动开发71 Sencha项目开发、调试方法建议

    原文地址:http://blog.csdn.net/lovelyelfpop/article/details/50171151 一.开发时的调试 方法1:不开启任何服务器 因为Sencha项目在开发状 ...

  6. PHP 后端开发之调试方法

    emmmmmmmmm,在我们进行php后端开发过程中,难免会遇到各种问题,这时候需要进行调试,对于一个新手来说,无疑是各种头疼问题,以下将介绍几种调试方法: 1.最古老的方法---文件输出 这个方法屡 ...

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

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

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

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

  9. Makefile常用调试方法

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

最新文章

  1. 发条js调试工具_小工具大帮手,利用 @open-node/antman 实现 node.js 进程线上调试,无须重启...
  2. Ubuntu 14.04+cuda 7.5+caffe安装配置
  3. Unity3D游戏-愤怒的小鸟游戏源码和教程(二)
  4. 面试题总结(21-40)
  5. VTK:可视化之Glyph3DImage
  6. keras基本结构功能
  7. Linux下root密码丢失和运行级别错误的解决办法
  8. java生产者消费者代码_Java实现Kafka生产者消费者代码实例
  9. 胡润富豪榜2020出炉,雷军身价是任正非的十倍?
  10. windows 编写的脚本 无法在linux下运行
  11. Packet Tracer 5.0建构CCNA实验攻略2配置vlan
  12. PS-elevenday-铅笔工具(颜色替换)
  13. html5 css3学习资料、教程、实例收集
  14. XXL-JOB快速入门搭建
  15. xargs -i参数详解
  16. 服务器2400系列和2600系列,英特尔至强处理器2400系列和2600系列有什么不同
  17. 苏东坡有一句“八风吹不动,独坐紫金台“ 人生智慧
  18. 计算机会计和传统手工会计的区别,简要比较手工会计和计算机数据处理方式的区别...
  19. simHash 简介以及 java 实现
  20. html代码自动排列,html页面如何实行数据排序?(附代码)

热门文章

  1. 存在描述所有生命的方程吗?
  2. 实现计算机界“大满贯”,芮勇博士再获技术成就大奖
  3. 大咖 | 斯坦福教授骆利群:为何人脑比计算机慢1000万倍,却如此高效?
  4. AI版「盗梦空间」?谷歌大脑「世界模型」可实现在其梦境中对智能体进行训练
  5. 争自动驾驶领头羊还是确保技术安全?欧美选择不同
  6. 程序员的月薪 | 每日趣闻
  7. “35 岁才是一个程序员成熟的开始!”
  8. 3 行 Python 代码实现假聊天机器人(慎入:这是假机器人!!!)
  9. 选中断还是轮询方式?深究其中的区别
  10. 程序员看过来!JS、Java、C 依然强势,Go、Kotlin、Python 潜力股,2020 开发者生态系统报告