c-高山linux上的程序段错误.我该如何解决?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c-高山linux上的程序段错误.我该如何解决?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2187字,纯文字阅读大概需要4分钟。
内容图文
![c-高山linux上的程序段错误.我该如何解决?](/upload/InfoBanner/zyjiaocheng/947/dd41234c8da0417cb194df8ab440c846.jpg)
我一直在C/C++和wrote a program C中开发一个webrtc数据通道库,以:
>通过相同的过程创建两个对等体.
>在它们之间建立连接.
>如果连接成功,则关闭连接.
在debian docker容器上和我的主机opensuse tumbleweed(所有x86_64和64bit)上,一切运行良好,但是在高山linux容器(64bit x86_64)上,子进程内部出现SEGFAULT:
上面的功能来自程序的依赖项“ libnice”.似乎* agent == NULL,并且在caller’s范围内无法将其设置为null.我什至插入了printf(“ Argument is%p”,agent);就在函数调用之前,它会打印出它的内存,我可以确认它不为null.从反汇编中,看起来像是一行代码,其中复制代理的内容(0x557a1d20)作为被调用者堆栈中的本地变量会导致段错误.即使在进行清理和重新编译后,此段错误始终会在此时发生.激活记录失败?堆栈损坏?
更新:我制作了一个更轻巧的容器并运行了它,现在它在同一个priv_conn_keepalive_tick_unlocked中的另一个位置进行段错误修复.该参数似乎已设置(请注意0x7ffff7f9ad08):
因为我以为我可能会达到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);
内容总结
以上是互联网集市为您收集整理的c-高山linux上的程序段错误.我该如何解决?全部内容,希望文章能够帮你解决c-高山linux上的程序段错误.我该如何解决?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。