onvif规范的实现:onvif开发常用调试方法 和常见的segmentation fault错误
在前几篇中,虽然已经实现了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直接看最后面的信息
- 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='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错误相关推荐
- 饥荒联机版Mod开发——常用inst方法(八)
饥荒联机版Mod开发--常用inst方法(八) 前言 生成实体 监听/推送事件 使用标签 增删组件 网络组件 定时/阶段任务 回调函数 父子实体 平台 删除 位置,角度 显示/隐藏 判断 大脑 状态图 ...
- 用GDB调试Segmentation Fault错误
调试Linux程序的时候,出现Segmentation Fault是最郁闷的事情了,程序代码量很大的时候,可能花很多时间都找不到出错原因. 这里介绍一种对你调试Segmentation ...
- Web开发常规调试方法与常见问题分析
一.Web项目基本原理 现在的web项目大都已经前后端独立开发与部署. 前后端独立开发,一般是前端与后端通过web接口(常见的有RESTful与websocket)文档进行交流.前端开发人员先更具业务 ...
- 瑞芯微读取寄存器_经验-瑞芯微RK3399嵌入式开发板调试方法-电路城论坛 - 电子工程师学习交流园地...
RK3399的CPU采用big.LITTLE大小核架构,双Cortex-A72大核+四Cortex-A53小核结构,对整数.浮点.内存等作了大幅优化,在整体性能.功耗及核心面积三个方面都具革命性提升. ...
- [Phonegap+Sencha Touch] 移动开发71 Sencha项目开发、调试方法建议
原文地址:http://blog.csdn.net/lovelyelfpop/article/details/50171151 一.开发时的调试 方法1:不开启任何服务器 因为Sencha项目在开发状 ...
- PHP 后端开发之调试方法
emmmmmmmmm,在我们进行php后端开发过程中,难免会遇到各种问题,这时候需要进行调试,对于一个新手来说,无疑是各种头疼问题,以下将介绍几种调试方法: 1.最古老的方法---文件输出 这个方法屡 ...
- [转载]Android开发常用调试技术记录
ANDROID 调试技术: 1)Ps 指令 ls –l /proc/27/ cat /proc/27/cmdline #cmdline文件表示了这个进程所在的命令行. cat /proc/ ...
- android开发常用技术,[转载]Android开发常用调试技术记录
ANDROID 调试技术: 1)Ps 指令 ls –l /proc/27/ cat /proc/27/cmdline #cmdline文件表示了这个进程所在的命令行. cat /proc/ ...
- Makefile常用调试方法
转载自 陈皓<跟我一起写 Makefile><GNU Make项目管理> GNU make 提供了若干可以协助调试的内置函数以及命令行选项. 1.warning函数 $(war ...
最新文章
- 发条js调试工具_小工具大帮手,利用 @open-node/antman 实现 node.js 进程线上调试,无须重启...
- Ubuntu 14.04+cuda 7.5+caffe安装配置
- Unity3D游戏-愤怒的小鸟游戏源码和教程(二)
- 面试题总结(21-40)
- VTK:可视化之Glyph3DImage
- keras基本结构功能
- Linux下root密码丢失和运行级别错误的解决办法
- java生产者消费者代码_Java实现Kafka生产者消费者代码实例
- 胡润富豪榜2020出炉,雷军身价是任正非的十倍?
- windows 编写的脚本 无法在linux下运行
- Packet Tracer 5.0建构CCNA实验攻略2配置vlan
- PS-elevenday-铅笔工具(颜色替换)
- html5 css3学习资料、教程、实例收集
- XXL-JOB快速入门搭建
- xargs -i参数详解
- 服务器2400系列和2600系列,英特尔至强处理器2400系列和2600系列有什么不同
- 苏东坡有一句“八风吹不动,独坐紫金台“ 人生智慧
- 计算机会计和传统手工会计的区别,简要比较手工会计和计算机数据处理方式的区别...
- simHash 简介以及 java 实现
- html代码自动排列,html页面如何实行数据排序?(附代码)
热门文章
- 存在描述所有生命的方程吗?
- 实现计算机界“大满贯”,芮勇博士再获技术成就大奖
- 大咖 | 斯坦福教授骆利群:为何人脑比计算机慢1000万倍,却如此高效?
- AI版「盗梦空间」?谷歌大脑「世界模型」可实现在其梦境中对智能体进行训练
- 争自动驾驶领头羊还是确保技术安全?欧美选择不同
- 程序员的月薪 | 每日趣闻
- “35 岁才是一个程序员成熟的开始!”
- 3 行 Python 代码实现假聊天机器人(慎入:这是假机器人!!!)
- 选中断还是轮询方式?深究其中的区别
- 程序员看过来!JS、Java、C 依然强势,Go、Kotlin、Python 潜力股,2020 开发者生态系统报告