创作人QQ:851301776,邮箱:lfr890207@163.com,欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点!

个人座右铭:
1.没有横空出世,只要厚积一定发。
2.你可以学历不高,你可以不上学,但你不能不学习

一、错误展示

Thread 3 "onvif" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff1c4e700 (LWP 8982)]
0x00007ffff3d3ecd0 in _IO_vfprintf_internal (s=0x7ffff40b5620 <_IO_2_1_stdout_>, format=<optimized out>, format@entry=0x7a073d "% %d %s xADDR:%s\n", ap=ap@entry=0x7ffff1c4da18) at vfprintf.c:1632
1632    vfprintf.c: 没有那个文件或目录.

查看堆栈:

(gdb) bt
#0  0x00007ffff3d3ecd0 in _IO_vfprintf_internal (s=0x7ffff40b5620 <_IO_2_1_stdout_>, format=<optimized out>, format@entry=0x7a073d "% %d %s xADDR:%s\n", ap=ap@entry=0x7ffff1c4da18) at vfprintf.c:1632
#1  0x00007ffff3e06aef in ___printf_chk (flag=flag@entry=1, format=format@entry=0x7a073d "% %d %s xADDR:%s\n") at printf_chk.c:35
#2  0x000000000075c168 in printf (__fmt=0x7a073d "% %d %s xADDR:%s\n") at /usr/include/x86_64-linux-gnu/bits/stdio2.h:104
#3  NVR_camera_channel_num_que_node_exists_XAddr (p=p@entry=0xc67eb8, nvr_XAddr=0x7fffe00466a0 "http://192.168.3.110:80/onvif/device_service ") at NVR_camera_channel_num_que.c:158
#4  0x0000000000453416 in p_onvif_server_udp (arg=0xc67e00) at pthread_onvif_server_udp.c:303
#5  0x00007ffff7bc16ba in start_thread (arg=0x7ffff1c4e700) at pthread_create.c:333
#6  0x00007ffff3df751d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109

确定代码出错位置:

二、解决

1.在错误的函数中增加断点

(gdb) b NVR_camera_channel_num_que.c:158
Breakpoint 1 at 0x75c13d: file NVR_camera_channel_num_que.c, line 158.

2.重启并且单步调试

(gdb) r
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /mnt/hgfs/project/visual_gateway/software/src_intra_20220618/onvif
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
[2022/06/21 15:02:29]: vivsual gateway is starting
[2022/06/21 15:02:29]: [2022/06/21 15:02:29]: para file already exist!
[2022/06/21 15:02:29]: parameter config file init succeed!~
[2022/06/21 15:02:29]: init complete!
[2022/06/21 15:02:29]: Redis_host_port:6379
[2022/06/21 15:02:29]: Redis_protocol_type:tcp
[2022/06/21 15:02:29]: Redis_protocol_type:127.0.0.1
[2022/06/21 15:02:29]: Redis_whether_use:YES
[2022/06/21 15:02:29]: Redis_channel_name:pubtoplat
[2022/06/21 15:02:29]: MySQL_host_port:3306
[2022/06/21 15:02:29]: MySQL_user_name:root
[2022/06/21 15:02:29]: MySQL_pass_word:1
[2022/06/21 15:02:29]: MySQL_host_ip:127.0.0.1
[2022/06/21 15:02:29]: MySQL_database:demo1
[2022/06/21 15:02:29]: MySQL_charset:utf8
[2022/06/21 15:02:29]: MySQL_protocol_type:tcp
[2022/06/21 15:02:29]: UDP_active:YES
[2022/06/21 15:02:29]: TCP_active:YES
[2022/06/21 15:02:29]: TCP_passivity:YES
[2022/06/21 15:02:29]: up_sip_id:34020000002000000001
[2022/06/21 15:02:29]: up_Realm:34020000002
[2022/06/21 15:02:29]: up_Password:123456789
[2022/06/21 15:02:29]: up_Username:admin
[2022/06/21 15:02:29]: up_Nonce:1622614946
[2022/06/21 15:02:29]: up_host:192.168.1.2
[2022/06/21 15:02:29]: up_port:6100
[2022/06/21 15:02:29]: UDP_AC_SIP_id:34020000002000000001
[2022/06/21 15:02:29]: UDP_AC_Realm:3402000000
[2022/06/21 15:02:29]: UDP_AC_Password:123456789
[2022/06/21 15:02:29]: UDP_AC_Username:root
[2022/06/21 15:02:29]: UDP_AC_Nonce:1622614945
[2022/06/21 15:02:29]: UDP_ListenHost_buff:eth0
[2022/06/21 15:02:29]: UDP_ListenPort:5800
[2022/06/21 15:02:29]: TCP_AC_SIP_id:34020000002000000004
[2022/06/21 15:02:29]: TCP_AC_Realm:3402000001
[2022/06/21 15:02:29]: TCP_AC_Password:123456789
[2022/06/21 15:02:29]: TCP_AC_Username:root
[2022/06/21 15:02:29]: TCP_AC_Nonce:1622614945
[2022/06/21 15:02:29]: TCP_ListenHost_buff:eth1
[2022/06/21 15:02:29]: TCP_ListenPort:5900
[2022/06/21 15:02:29]: TCP_PS_SIP_id:34020000002000000005
[2022/06/21 15:02:29]: TCP_PS_Realm:3402000002
[2022/06/21 15:02:29]: TCP_PS_Password:123456789
[2022/06/21 15:02:29]: TCP_PS_Username:root
[2022/06/21 15:02:29]: TCP_PS_Nonce:1622614945
[2022/06/21 15:02:29]: TCP_SerHost_buff:eth2
[2022/06/21 15:02:29]: TCP_SerPort:6000
[2022/06/21 15:02:29]: msg_conf_file:../msg/msg_file.txt
[2022/06/21 15:02:29]: SIP_connect_STA_file:../para/platform_para.txt
ptr->msg_qid:0
[New Thread 0x7ffff7fc0700 (LWP 9045)]
[2022/06/21 15:02:29]: Create Pthread (p_data_deal) ok
[New Thread 0x7ffff1c4e700 (LWP 9046)]
[2022/06/21 15:02:29]: Create Pthread (p_onvif_server_udp) ok
[2022/06/21 15:02:29]: p_data_deal stack size: 1052672
pthread_onvif_server_udp.c 269 p_onvif_server_udp suc
pthread_onvif_server_udp.c 278 p_onvif_server_udp recv ================= + dump__wsdd__ProbeMatches + >>>
wsdd__ProbeMatches: (0x7fffe8047da0)|- __sizeProbeMatch: 1|- ProbeMatch: (0x7fffe8047da8)|- 0|- wsa__EndpointReference: (0x7fffe80466f0)|- Address: urn:uuid:055e81bd-1787-49f8-bb60-3cda6d9939da|- ReferenceProperties: (null)|- ReferenceParameters: (null)|- PortType: (null)|- ServiceName: (null)|- __size: 0|- __any: (null)|- __anyAttribute: |- Types: tdn:NetworkVideoTransmitter tds:Device|- Scopes: (0x7fffe8047f80)|- __item:  onvif://www.onvif.org/type/video_encoder onvif://www.onvif.org/type/audio_encoder onvif://www.onvif.org/type/ptz onvif://www.onvif.org/Profile/Streaming onvif://www.onvif.org/hardware/hisi onvif://www.onvif.org/mfr/ipcamera onvif://www.onvif.org/location/country/china onvif://www.onvif.org/location/city/tianjin onvif://www.onvif.org/mac onvif://www.onvif.org/firmware/APP_V3.3.0.20200713 onvif://www.onvif.org/name/ipcamera|- MatchBy: (null)|- XAddrs: http://192.168.3.110:80/onvif/device_service |- MetadataVersion: 1
================= - dump__wsdd__ProbeMatches - <<<
pthread_onvif_server_udp.c 283 p_onvif_server_udp suc
pthread_onvif_server_udp.c 301 p_onvif_server_udp count:1
[Switching to Thread 0x7ffff1c4e700 (LWP 9046)]Thread 3 "onvif" hit Breakpoint 1, NVR_camera_channel_num_que_node_exists_XAddr (p=p@entry=0xc67eb8, nvr_XAddr=0x7fffe80466a0 "http://192.168.3.110:80/onvif/device_service ") at NVR_camera_channel_num_que.c:160
160         if(SUC_RET == memcmp(tmp_node->nvr_XAddr, nvr_XAddr, MAX(strlen(tmp_node->nvr_XAddr), strlen(nvr_XAddr))) )

单步调试:

Thread 3 "onvif" hit Breakpoint 2, NVR_camera_channel_num_que_node_exists_XAddr (p=p@entry=0xc67eb8, nvr_XAddr=0x7fffe00466a0 "http://192.168.3.110:80/onvif/device_service ") at NVR_camera_channel_num_que.c:148
148     if((!p) || (!nvr_XAddr))
(gdb) n
147 {
(gdb)
153     if(p->head.p_next == &(p->tail)) return 1;
(gdb) n
147 {
(gdb) n
153     if(p->head.p_next == &(p->tail)) return 1;
(gdb) n
156     for(tmp_node = &(p->head.p_next);tmp_node != &(p->tail); tmp_node = tmp_node->p_next)
(gdb) n
153     if(p->head.p_next == &(p->tail)) return 1;
(gdb) nThread 3 "onvif" hit Breakpoint 1, NVR_camera_channel_num_que_node_exists_XAddr (p=p@entry=0xc67eb8, nvr_XAddr=0x7fffe00466a0 "http://192.168.3.110:80/onvif/device_service ") at NVR_camera_channel_num_que.c:160
160         if(SUC_RET == memcmp(tmp_node->nvr_XAddr, nvr_XAddr, MAX(strlen(tmp_node->nvr_XAddr), strlen(nvr_XAddr))) )
(gdb) n
158         printf("% %d %s xADDR:%s\n", __FILE__, __LINE__, __func__, nvr_XAddr);
(gdb) nThread 3 "onvif" received signal SIGSEGV, Segmentation fault.
0x00007ffff3d3ecd0 in _IO_vfprintf_internal (s=0x7ffff40b5620 <_IO_2_1_stdout_>, format=<optimized out>, format@entry=0x7a073d "% %d %s xADDR:%s\n", ap=ap@entry=0x7ffff1c4da18) at vfprintf.c:1632
1632    vfprintf.c: 没有那个文件或目录.
(gdb)

问题基础确认为:

基础解决:屏蔽对应的函数

继续重新调试:

Thread 3 "onvif" hit Breakpoint 2, NVR_camera_channel_num_que_node_exists_XAddr (p=p@entry=0xc67eb8, nvr_XAddr=0x7fffe00466a0 "http://192.168.3.110:80/onvif/device_service ") at NVR_camera_channel_num_que.c:148
148     if((!p) || (!nvr_XAddr))
(gdb) n
147 {
(gdb) n
153     if(p->head.p_next == &(p->tail)) return 1;
(gdb) n
147 {
(gdb) n
153     if(p->head.p_next == &(p->tail)) return 1;
(gdb) n
156     for(tmp_node = &(p->head.p_next);tmp_node != &(p->tail); tmp_node = tmp_node->p_next)
(gdb) n
153     if(p->head.p_next == &(p->tail)) return 1;
(gdb) nThread 3 "onvif" hit Breakpoint 1, NVR_camera_channel_num_que_node_exists_XAddr (p=p@entry=0xc67eb8, nvr_XAddr=0x7fffe00466a0 "http://192.168.3.110:80/onvif/device_service ") at NVR_camera_channel_num_que.c:160
160         if(SUC_RET == memcmp(tmp_node->nvr_XAddr, nvr_XAddr, MAX(strlen(tmp_node->nvr_XAddr), strlen(nvr_XAddr))) )
(gdb) n
164         printf("%s %d %s \n", __FILE__, __LINE__, __func__ );
(gdb) n
NVR_camera_channel_num_que.c 164 NVR_camera_channel_num_que_node_exists_XAddr
156     for(tmp_node = &(p->head.p_next);tmp_node != &(p->tail); tmp_node = tmp_node->p_next)
(gdb) nThread 3 "onvif" hit Breakpoint 1, NVR_camera_channel_num_que_node_exists_XAddr (p=p@entry=0xc67eb8, nvr_XAddr=0x7fffe00466a0 "http://192.168.3.110:80/onvif/device_service ") at NVR_camera_channel_num_que.c:160
160         if(SUC_RET == memcmp(tmp_node->nvr_XAddr, nvr_XAddr, MAX(strlen(tmp_node->nvr_XAddr), strlen(nvr_XAddr))) )
(gdb) nThread 3 "onvif" received signal SIGSEGV, Segmentation fault.
strlen () at ../sysdeps/x86_64/strlen.S:106
106 ../sysdeps/x86_64/strlen.S: 没有那个文件或目录.
(gdb) bt
#0  strlen () at ../sysdeps/x86_64/strlen.S:106
#1  0x000000000075c14c in NVR_camera_channel_num_que_node_exists_XAddr (p=p@entry=0xc67eb8, nvr_XAddr=0x7fffe00466a0 "http://192.168.3.110:80/onvif/device_service ") at NVR_camera_channel_num_que.c:160
#2  0x0000000000453416 in p_onvif_server_udp (arg=0xc67e00) at pthread_onvif_server_udp.c:303
#3  0x00007ffff7bc16ba in start_thread (arg=0x7ffff1c4e700) at pthread_create.c:333
#4  0x00007ffff3df751d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109

这里的问题为调用strlen函数导致的段错误,这时候就需要分析:

memcmp(tmp_node->nvr_XAddr, nvr_XAddr, MAX(strlen(tmp_node->nvr_XAddr), strlen(nvr_XAddr))) )

其实经常调试的就知道,其实这种问题就是代码逻辑的错误,已分配内存但是未写入数据的访问造成的

代码中增加:

Thread 3 "onvif" hit Breakpoint 1, NVR_camera_channel_num_que_node_exists_XAddr (p=p@entry=0xc67eb8, nvr_XAddr=0x7fffe00466a0 "http://192.168.3.110:80/onvif/device_service ") at NVR_camera_channel_num_que.c:148
148     if((!p) || (!nvr_XAddr))
(gdb) n
147 {
(gdb) n
153     if(p->head.p_next == &(p->tail)) return 1;
(gdb) n
147 {
(gdb) n
153     if(p->head.p_next == &(p->tail)) return 1;
(gdb) n
156     for(tmp_node = &(p->head.p_next);tmp_node != &(p->tail); tmp_node = tmp_node->p_next)
(gdb) n
153     if(p->head.p_next == &(p->tail)) return 1;
(gdb) n
158         printf("tmp_node->nvr_XAddr:%p \n", tmp_node->nvr_XAddr);
(gdb) print  tmp_node->nvr_XAddr
$1 = '\000' <repeats 16 times>, "pubtoplat", '\000' <repeats 55 times>, "\353\030\000\000\000\000\000\000\321\000\000\000\000\000\000\000YES\000\377\177\000\000xK\v\364\377\177", '\000' <repeats 17 times>
(gdb) n
tmp_node->nvr_XAddr:0xc682c0
159         printf("nvr_XAddr:%p\n", nvr_XAddr);
(gdb) print Quit
(gdb) print nvr_XAddr
$2 = 0x7fffe00466a0 "http://192.168.3.110:80/onvif/device_service "

说明: tmp_node->nvr_XAddr对应的空地址,这个时候就需要查看源码了

这个问题为代码逻辑的错误。

最后查明为这个简单的链表未初始化,造成地址为空,循环判断造成的错误。

修改完成代码后,上一波调试如下:

解决了。

三、核心点

(1)printf函数底层会调用malloc函数,如果程序陷入死循环,会不停的调用malloc

(2)gdb调试,其实这种调试主要是:断点、单步、打印(print)

0x00007ffff3d3ecd0 in _IO_vfprintf_internal (s=0x7ffff40b5620 <_IO_2_1_stdout_>相关推荐

  1. <binding>和<operation>元素

    <binding>和<operation>元素 Binding栏是完整描述协议.序列化和编码的地方,Types, Messages和PortType栏处理抽象的数据内容,而Bi ...

  2. 水鱼 学习回顾 <1>

    学习回顾 <1> 1.注释 2.选择语句 3.循环语句 4.函数 5.数组 6.操作符 7.关键字 8.其他穿插知识点 1.注释 鼠标选中代码块 Ctrl+K+C 快速注释 int num ...

  3. 封装自定义的redis切库工具类ByteArrayRedisTemplate,读取byte数组反序列化成List<Object>

    封装自定义的redis切库工具类ByteArrayRedisTemplate,读取byte数组反序列化成List<Object>(使用lettuce连接池) 代码环境 框架:springb ...

  4. mybatis中<mappers> ,mapperLocations,和MapperScannerConfigurer 用法

    mybatis中<mappers> ,mapperLocations,和MapperScannerConfigurer 用法 1. mappers标签 在mybatis单独使用时,myba ...

  5. 训练时发生的错误:Couldn‘t open shared file mapping: <000001910A228862>, error code: <1455>

    今天在运行TTSR时第14个epoch时发生了以下错误: 看到一篇博客有写: RuntimeError: Couldn't open shared file mapping: <torch_37 ...

  6. C++头文件<functional>和bind、placeholders占位符使用简单例子

    相关博文:C++新特性探究(十五):bind 相关博文:C++头文件<functional>和bind.placeholders占位符使用简单例子 相关博文:<Essential C ...

  7. opencv中 .at<uchar>()和.ptr<uchar>()使用方法的区别

    opencv中 .at<uchar>()和.ptr<uchar>()使用方法的区别在opencv中,.at<uchar>()和.ptr<uchar>() ...

  8. vector<int> v, vector<int> v(n) 与vector<int> v[n]的区别

    一.vector<int> v表示声明一个容器v,并且不给他预定存储空间. 运行: vector<int> v;cout << v.size(); 输出为: 0 二 ...

  9. 新书预告<******笔记>快赏

       我一个朋友写的书,感觉不错,喜欢的朋友可以买一本来看看,物有所值! 以下是关于该书的一些介绍. 原点注:我写的,大家多多捧场了,呵呵!序是请LCX写的! 官方连接:http://www.noha ...

最新文章

  1. __new__ __init__区别
  2. 用户界面改变图片锚点
  3. 如何写出安全的API接口
  4. 算法 - 普里姆算法(修路问题求解)
  5. Spring + Dubbo + zookeeper (linux) 框架搭建
  6. GCC 加工程序的过程
  7. php读写分离是什么意思,php mysql读写分离
  8. fedora 16 x64 安装gnustep object-c开发环境
  9. Android Studio如何打jar包
  10. 机器学习中的数学:微积分与最优化
  11. 2020.10.16 web前端 盒子模型border-box 图片模糊处理(filter)clac的使用 CSS的过渡(trancsion hover)
  12. 【20200207】【lyk】TJOI2019 唱、跳、rap、篮球题解
  13. 服务器被入侵了,怎么防范服务器被黑客入侵情况
  14. excel函数去重_Excel去除重复值方法汇总
  15. 东北大学oj平台python答案_你觉得东北大学的Python考试怎么样?
  16. 这个程序我在华为mate8里面点击按钮会出现闪退求助多谢
  17. win10下右键菜单项里没有“打开方式“的解决办法
  18. 红帽考试RHCSA练习
  19. root账号密码遗忘解决
  20. initramfs学习

热门文章

  1. 函数的值域【基础辅导和中阶辅导】
  2. 萌新面试经,赶紧来看看!
  3. axture动画原型制作_小孩子最喜欢的国产“机甲”动画,90后全看过,00后一个也不知道...
  4. Telnet访问百度www.baidu.com
  5. Chinaren校友录所用的左边弹出式菜单
  6. 打开计算机任务栏有桌面没,开机后桌面没有图标任务栏无显示怎么解决
  7. esp8266微信wifi配置AIRKISS
  8. dockers安装redis
  9. 「跳一跳」两年后,广告“杀死”游戏小程序?
  10. 64位W7系统安装内存8G,但是系统只显示3.2G,是怎么回事?