ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

c-高山linux上的程序段错误.我该如何解决?

2019-11-10 15:01:10  阅读:216  来源: 互联网

标签:alpine stack-corruption c-3 linux c-4


我一直在C/C++和wrote a program C中开发一个webrtc数据通道库,以:

>通过相同的过程创建两个对等体.
>在它们之间建立连接.
>如果连接成功,则关闭连接.

在debian docker容器上和我的主机opensuse tumbleweed(所有x86_64和64bit)上,一切运行良好,但是在高山linux容器(64bit x86_64)上,子进程内部出现SEGFAULT:

segfault in libnice

上面的功能来自程序的依赖项“ libnice”.似乎* agent == NULL,并且在caller’s范围内无法将其设置为null.我什至插入了printf(“ Argument is%p”,agent);就在函数调用之前,它会打印出它的内存,我可以确认它不为null.从反汇编中,看起来像是一行代码,其中复制代理的内容(0x557a1d20)作为被调用者堆栈中的本地变量会导致段错误.即使在进行清理和重新编译后,此段错误始终会在此时发生.激活记录失败?堆栈损坏?

更新:我制作了一个更轻巧的容器并运行了它,现在它在同一个priv_conn_keepalive_tick_unlocked中的另一个位置进行段错误修复.该参数似乎已设置(请注意0x7ffff7f9ad08):
segfault2

因为我以为我可能会达到libmusl’s的默认堆栈限制80k,所以我使用getrlimit(RLIMIT_STACK,& rl)来获取堆栈大小,看起来已经是8 MB而不是80k.进一步增加此限制似乎没有任何区别,除了如果我分配的内存超过8 MB,我的程序会在Gdb中提前崩溃. Gdb表示收到未知信号“??”;在gdb外部,它会在正常情况下崩溃,而正常情况下该崩溃通常不会更改堆栈大小.

我不确定到底是什么问题(堆栈损坏?)以及下一步如何解决此问题.

这是我程序的流程:

对于创建的每个对等方,都会使用fork()创建一个子进程.父母<->子通信由ZeroMQ完成,我使用协议缓冲区将在子内部触发的所有回调(及其回调)转发到在父进程中运行的事件循环.

因此,对于上述程序,有2个子进程和1个父进程.

重现步骤:

源文件:https://github.com/hamon-in/librtcdcpp/blob/alpine-test/examples/websocket_client/2in1.c
>高山Docker集装箱:https://github.com/hamon-in/librtcdcpp/blob/alpine-test/Dockerfile.amd64
>运行容器,二进制文件位于/ psl-librtcdcpp / examples / websocket_client / 2in1
> 2in1将产生两个子进程,这两个子进程都会崩溃.

解决方法:

在进一步研究中,崩溃发生在一条指令中,该指令与堆栈基址指针的负偏移量相差较大,因此它可能只是一个简单的堆栈溢出.

解决此问题的正确方法是减少过多的堆栈使用量或在pthread_create时显式请求大堆栈,但是我看不到从何处调用pthread_create.快速检查以确认这是问题所在,方法是在程序的早期执行以下操作来覆盖新线程的默认堆栈大小:

pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, 1<<20); // 1 MB
pthread_setattr_default_np(&attr);

标签:alpine,stack-corruption,c-3,linux,c-4
来源: https://codeday.me/bug/20191110/2013222.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有